【问题标题】:Simple way of reading a PDF, taking in text, and writing to a new PDF. (Java)阅读 PDF、获取文本和写入新 PDF 的简单方法。 (爪哇)
【发布时间】:2013-10-16 01:00:21
【问题描述】:

免责声明:我一直在尝试使用 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)。

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

谢谢!

【问题讨论】:

  • 你试过不同的输入/输出文件名,对吧?
  • @StefanoSanfilippo 是的,我试过了。就在那时,它给了我一个无法打开的损坏 PDF。
  • 我没有看到你关闭压模。您是否只是忘记将最终的stamper.close () 复制到您的问题中,还是真的丢失了?在后一种情况下添加它,但使用不同的文件名。
  • @mkl 我自己想出来的。我知道您通过这项努力帮助了我很多。查看解决方案的答案。

标签: java pdf itext


【解决方案1】:

是的,抱歉,我没有注意到文件名。

原答案:

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

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

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

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

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

【讨论】:

  • @Smit 我自己想出来的。不过,感谢您提供有用的意见。查看答案。
【解决方案2】:

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

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

//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 中。

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

【讨论】:

  • 我将您的解决方案从您的问题(这不是真正的问题)迁移到此处的答案正文中,它所属的位置。为您自己的问题写一个答案是非常好的,事实上,如果您能够对这个问题有新的认识,我们鼓励这样做。
猜你喜欢
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
相关资源
最近更新 更多