【问题标题】:iTextSharp - Merging a Batch of PDF Byte ArraysiTextSharp - 合并一批 PDF 字节数组
【发布时间】:2019-02-14 20:52:44
【问题描述】:

我正在使用 iTextSharp 填充 pdf 上的一些字段。我需要能够将一系列这些 pdf 组合成一个批处理 pdf 文件。下面我循环一个 SQL 结果集,用与当前记录对应的值填充 pdf 的字段,将其存储为字节数组,并将所有这些合并到一个字节数组列表中。然后,我尝试将该列表中的merge each byte array 转换为单字节数组,并将其作为 pdf 文件提供给用户。

它似乎可以工作,生成一个包含可能与我的结果集中一样多的单独页面的单个文件,但每页上的所有字段都是空白的。使用 FillForm() 提供单个 pdf 时,它按预期工作。我做错了什么?

byte[] pdfByteArray = new byte[0]; 
List<byte[]> pdfByteArrayList = new List<byte[]>();
byte[] pdfByteArrayItem = new byte[0];

foreach (DataRow row in results.Rows)
{
    certNum = row[1].ToString();
    certName = row[2].ToString();
    certDate = row[3].ToString();
    pdfByteArrayItem = FillForm(certType, certName, certNum, certDate);
    pdfByteArrayList.Add(pdfByteArrayItem);

}

using (var ms = new MemoryStream()) {
    using (var doc = new Document()) {
        using (var copy = new PdfSmartCopy(doc, ms)) {
            doc.Open();

            //Loop through each byte array
            foreach (var p in pdfByteArrayList) {

                //Create a PdfReader bound to that byte array
                using (var reader = new PdfReader(p)) {

                    //Add the entire document instead of page-by-page
                    copy.AddDocument(reader);
                }
            }

            doc.Close();
        }
    }

pdfByteArray = ms.ToArray();
context.Response.ContentType = "application/pdf";
context.Response.BinaryWrite(pdfByteArray);
context.Response.Flush();
context.Response.End();

private byte[] FillForm(string certType, string certName, string certNum, string certDate)
{
    string pdfTemplate = string.Format(@"\\filePath\{0}.pdf", certType);

    PdfReader pdfReader = new PdfReader(pdfTemplate);

    MemoryStream stream = new MemoryStream();
    PdfStamper pdfStamper = new PdfStamper(pdfReader, stream);

    AcroFields pdfFormFields = pdfStamper.AcroFields;

    // set form pdfFormFields
    pdfFormFields.SetField("CertName", certName);
    pdfFormFields.SetField("CertNum", certNum);
    pdfFormFields.SetField("CertDate", certDate);

    // flatten the form to remove editting options, set it to false
    // to leave the form open to subsequent manual edits
    pdfStamper.FormFlattening = false;

    // close the pdf
    pdfStamper.Close();
    stream.Flush();
    stream.Close();

    byte[] pdfByte = stream.ToArray();

    return pdfByte;
}

【问题讨论】:

    标签: c# itext


    【解决方案1】:

    在设置字段值后添加以下行似乎已修复它:

    pdfFormFields.GenerateAppearances = true;

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 2013-03-09
      • 2023-03-22
      • 2011-04-27
      • 2021-03-20
      • 1970-01-01
      相关资源
      最近更新 更多