2

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

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(); 

       } 

      } 
     } 

回答

5

正如我在书中记载iText in Action提供一段代码,您无法读取文件的同时写入。想想Word是如何工作的:你无法打开Word文档并直接写入。 Word总是创建一个临时文件,将更改写入它,然后用它替换原始文件,然后丢弃该临时文件。

你可以做到这一点:

  • 阅读PdfReader原始文件,
  • 创建一个临时文件PdfStamper,当你完成后,
  • 与临时替换原文件文件。

或者:

  • 读取原始文件转换成byte[]
  • 创建PdfReader这个byte[],并
  • 使用路径到原始文件的PdfStamper

第二个选项更加危险,因为如果您在PdfStamper中做了导致例外的情况,您将丢失原始文件。

+0

我遵循你的第一个方法,并使用压模创建一个临时文件,后来用它来替换原始文件。但是,由于PDF是从SDL Tridion发布并存储在Tridion文件系统中的,因此我们无法对原始编辑/删除进行任何更改。 Evrytime我尝试删除原来的以下错误: e:\ Web \ Compliance \ NonPCI \ SDL \ wwwroot \ xyzrights \ updatePdf.aspx:line 150访问路径'E:\ Web \ Compliance \ NonPCI \ SDL \ wwwroot \ xyzrights \ Images \ ListPrograming_Part1_AcroForm.pdf'被拒绝。 请帮忙.. – tk2013

+1

如果您没有删除文件的权限,您可能没有权限更新它。其权限可能设置为只读。您需要联系系统管理员。这不再是一个iText问题,而是一个关于文件权限的问题。 –

+0

@BrunoLowagie你能解释一下这一点吗? => **使用原始文件的路径作为PdfStamper ** – jason

相关问题