0

免责声明:我一直在尝试使用 iText 来做到这一点。我已经阅读、研究、询问、询问、实验,并做了我能想到的一切来完成这项工作。我很生气。请不要以为我没有尝试过,只是来到这里,以便我可以让其他人为我做这件事;事实并非如此。我想学习,我想弄清楚这一点。我正在从有这方面经验的人那里寻找一个好的方向。

我有一个包含可编辑文本字段的 PDF。我想要做的是以编程方式从该 PDF 中读取并从已经存在的文本字段中获取文本,从我的应用程序中的其他位置获取文本,然后将以前的信息 + 新的文本信息写回原始 PDF。

我尝试过:
- 使用 PdfReader 阅读 PDF
- 使用 PdfStamper(PdfReader, FileOutputStream) 写入 PDF
- 使用 reader.getAcroFields() 获取文本字段。

我已经在网上搜索了几天,但我无法解决这个问题。当我这样做时:

String in = "C:/Users/me/Desktop/file.pdf";
String out = "C:/Users/me/Desktop/file.pdf";
PdfReader reader = new PdfReader(in);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(out));
AcroFields form = stamper.getAcroFields();
form.setField("dateDisc1", "5/21");

它最终创建了一个损坏的 PDF (file.pdf)。

如果有更简单的方法可以做到这一点,请帮助我对此有所了解。

谢谢!

4

2 回答 2

1

是的对不起,我没有注意到文件名。

原答案:

好的,没有简单的方法,我在很多个月前就发现了这一点。

PDF 实际上是 PostScript 的某种包装(它包含字体等),将 PDF 转换为 PostScript 非常容易(我只是运行了一个命令并从那里开始处理 PostScript)

它不像 LaTeX,PostScript 是用于打印机的,它有一个堆栈,您可以在其中推送状态等,每个字母都是绝对定位的,PostScript 是一组用于打印机然后解释的虚拟机的指令。

文本突出显示等来自更高层次的知识,即文本从左到右流动等等。我阅读了 PostScript 标准,得到了我想要的东西并且没有触及它,这不是一个很好的答案,但肯定会为您指明正确的方向。

请记住,PDF 和 PostScript(文档)不是用于编辑的,它们不进行文本换行等,如果您缩放您必须平移,它们的存在是为了保留格式,用于打印机等。

于 2013-10-08T21:47:05.410 回答
0

我自己想出来的。我为将来希望做类似事情的其他人创建了一个演练:

我已经在网上搜索了几天,试图找到一种简单的方法来做到这一点。不成功,我坚持下去,并决心如果可能的话,我会让它发挥作用。我在互联网上看到了几十个地方,有人问如何做到这一点;现在,这是一个有据可查的例子。

//Define the location of the PDF and establish a new file to write to. We will change the target later//
    String dest = System.getProperty("user.home").concat("directory_and_name_of_PDF.pdf");
    String out = System.getProperty("user.home").concat("directory_and_name_that_will_be_changed.pdf");
    PdfReader pdfreader = new PdfReader(dest);                 
    PdfStamper stamper = new PdfStamper(pdfreader, new FileOutputStream(System.getProperty("user.home").concat("same_as_String out")));       
    AcroFields form = stamper.getAcroFields();  

//Append text to the text fields//
    form.setField("text field name", "text to add");
    form.setField("text field name2", "repeat");
    form.setField("text field name3", "repeat");
    form.setField("text field name4", "repeat");
    stamper.close();
    pdfreader.close();

//Change the file name of fileOutputStream to the original that was read from//
    File destfile = new File(dest);
    File outfile = new File(out);
    destfile.delete();        
    outfile.renameTo(new File(System.getProperty("user.home").concat("name_of_the_original_PDF.pdf"))); 

我们终于得到它了。请注意,这将删除原始文件并将fileOutputStream重命名为原始文件名;如果您没有阅读原文中的任何信息,它将丢失。确保收集您希望复制的所有信息。另外,请记住,我设置了一个条件语句 ( if) 以确保读取的文本字段中的任何文本都不会被覆盖。您将不得不这样做,否则您可能无法将以前的文本转移到新的 PDF 中。

如果有任何问题,请随时提问。我绝不是专业的开发人员,但我可以就我所知道的提供建议。记得在问之前先研究一下。祝你好运!

于 2013-10-09T18:25:11.947 回答