阅读PDF,接收文本和写入新PDF的简单方法 . (JAVA)

Disclaimer: 我一直试图用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) .

如果有更简单的方法,请帮助我对此有所了解 .

谢谢!

回答(2)

2 years ago

对不起,我没注意到文件名 .

Original answer:

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

PDF实际上是PostScript的一些包装(它包含字体等),将PDF转换为PostScript非常简单(我只是运行一个命令并从那里开始编写PostScript)

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

文本高亮等等来自于文本从左到右和东西流动的更高知识 . 我阅读了PostScript标准,得到了我想要的东西并且没有触及它,因为这不是一个伟大的答案,但肯定会指出你正确的方向 .

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

2 years ago

我自己搞清楚了 . 我在将来为其他人创建了一个演练,希望做类似的事情:

我已经在网上搜了几天,试图找到一种简单的方法 . 不成功,我挖了一脚,并决定如果有可能,我会让它发挥作用 . 我在互联网上看到过几十个地方,人们都在询问如何做到这一点;现在,这是一个记录良好的例子 .

//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 .

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