2

我需要用另一个词替换现有 PDF AcroField 中的一个词。我正在使用 iTEXTSHARP 的 PDFStamper 来做同样的事情,它工作正常。但是,这样做需要创建一个新的 PDF,我希望更改能够反映在现有的 PDF 本身中。如果我将目标文件名设置为与原始文件名相同,则不会反映任何更改。我是 iTextSharp 的新手,我做错了什么吗?请帮忙..我正在提供我正在使用的一段代码

  private void ListFieldNames(string s)
    {
        try
        {
            string pdfTemplate = @"z:\TEMP\PDF\PassportApplicationForm_Main_English_V1.0.pdf";
            string newFile = @"z:\TEMP\PDF\PassportApplicationForm_Main_English_V1.0.pdf";
            PdfReader pdfReader = new PdfReader(pdfTemplate);

            for (int page = 1; page <= pdfReader.NumberOfPages; page++)
            {
                PdfReader reader = new PdfReader((string)pdfTemplate);
                using (PdfStamper stamper = new PdfStamper(reader, new FileStream(newFile, FileMode.Create, FileAccess.ReadWrite)))
                {
                    AcroFields form = stamper.AcroFields;
                    var fieldKeys = form.Fields.Keys;
                    foreach (string fieldKey in fieldKeys)
                    {
                        //Replace Address Form field with my custom data
                        if (fieldKey.Contains("Address"))
                        {
                            form.SetField(fieldKey, s);
                        }    
                    }
                    stamper.FormFlattening = true;
                    stamper.Close();

                }

            }
        }
4

1 回答 1

5

正如我的iText in Action一书中所述,您不能同时读取文件并写入文件。想想 Word 的工作原理:您无法打开 Word 文档并直接对其进行写入。Word 总是创建一个临时文件,将更改写入其中,然后用它替换原始文件,然后丢弃临时文件。

你也能做到:

  • 读取原始文件PdfReader
  • 为 创建一个临时文件PdfStamper,完成后,
  • 用临时文件替换原始文件。

或者:

  • 将原始文件读入一个byte[],
  • PdfReader用这个创建byte[],并且
  • 将原始文件的路径用于PdfStamper.

第二个选项更危险,因为如果您在PdfStamper.

于 2013-04-18T12:13:32.027 回答