如何更新,而无需创建一个新的PDF一个PDF?(How to update a PDF withou

2019-08-31 10:59发布

我需要在现有的PDF AcroField用另一个词来替换一个词。 我使用iTextSharp的的PDFStamper做同样的,它是工作的罚款。 但是,这样做就需要创建一个新的PDF,我想改变在现有的PDF本身中得到体现。 如果我设定目标文件名一样的原始文件名则没有变化正在reflected.I是新来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();

                }

            }
        }

Answer 1:

正如我在书中记载在行动iText的 ,您无法读取文件的同时写入。 想想Word如何工作的:你不能打开一个Word文档并直接写入。 Word总是创建一个临时文件,写入更改,然后替换它的原始文件,然后扔掉的临时文件。

你也能做到:

  • 阅读与原始文件PdfReader
  • 创建一个临时文件PdfStamper ,当你做,
  • 替换临时文件中的原始文件。

要么:

  • 读出的原始文件转换成byte[]
  • 创建PdfReader与此byte[]
  • 使用路径设置为原始文件PdfStamper

第二种选择是比较危险的,因为如果你做一些事情,导致异常你会失去原来的文件PdfStamper



文章来源: How to update a PDF without creating a new PDF?