我需要将现有 PDF AcroField 中的一个单词替换为另一个单词。我正在使用 iTEXTSHARP 的 PDFStamper 来做同样的事情,并且工作正常。但是,这样做需要创建一个新的 PDF,并且我希望更改能够反射(reflect)在现有的 PDF 本身中。如果我将目标文件名设置为与原始文件名相同,则不会反射(reflect)任何更改。我是 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(); 
 
                } 
 
            } 
        } 

请您参考如下方法:

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

你也可以这样做:

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

或者:

  • 将原始文件读入byte[]
  • 使用此 byte[] 创建 PdfReader,并且
  • 使用 PdfStamper 的原始文件路径。

第二个选项更危险,因为如果您执行的操作导致 PdfStamper 中出现异常,您将丢失原始文件。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!