我需要用另一个单词替换现有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(); } } }
2 回答
慕容708150
TA贡献1831条经验 获得超4个赞
如我的《iText in Action》一书中所述,您不能同时读取和写入文件。想一想Word的工作原理:您无法打开Word文档并直接对其进行写入。Word总是创建一个临时文件,将更改写入其中,然后用它替换原始文件,然后丢弃该临时文件。
你也能做到:
阅读与原来的文件PdfReader,
为创建一个临时文件PdfStamper,完成后,
用临时文件替换原始文件。
要么:
将原始文件读入byte[],
创建PdfReader与此byte[],和
将原始文件的路径用于PdfStamper。
第二种选择更为危险,因为如果您执行某些操作会导致中的异常,则您将丢失原始文件PdfStamper。
翻翻过去那场雪
TA贡献2065条经验 获得超13个赞
我遵循了您的第一种方法,并使用压模创建了一个临时文件,该文件后来用于替换原始文件。但是,由于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'被拒绝。请帮助.
- 2 回答
- 0 关注
- 339 浏览
添加回答
举报
0/150
提交
取消