2013-10-08 141 views
0

免责声明:我一直在试图用iText来做到这一点。我已阅读,研究,询问,询问,试验,并尽我所能去做这项工作。我很气愤。请不要以为我没有尝试,只是来到这里,以便我可以让别人为我做这件事;事实并非如此。我想学习,我想弄清楚这一点。我正在寻找有经验的人的一个好方向。

简单的阅读PDF文件,读取文本和写入新的PDF文件。 (Java)

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

我曾尝试:
- 阅读PDF文件使用PdfReader
- 使用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

您是否尝试过使用不同的输入/输出文件名称,对吧? –

+0

@StefanoSanfilippo是的,我试过了。那是当它给我一个腐败的PDF不会打开。 – Rincewind

+1

我没有看到你关闭压模。你是否简单地忘记将最后的'stamper.close()'复制到你的问题中,还是真的丢失了?在后一种情况下添加它,但使用不同的文件名。 – mkl

回答

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

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

+0

我将您的解决方案从您的问题(这不是真正的问题)迁移到此处答案的正文中,它属于哪里。对自己的问题写一个答案是完全正确的,事实上,如果你能够解决问题,我们鼓励你。 –

1

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

原来的答复:

好吧有没有简单的方法,我很久以前发现了这一点。

PDF实际上是某种身边的PostScript包装的(它包含字体和等),并转换PDF到PostScript是很容易的(我只是跑的命令,并从那里上的PostScript工作)

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

文字highlighing等来自更高的知识,文字从左到右流动的东西。我阅读了PostScript标准,得到了我想要的并且没有触及它,但这不是一个伟大的策略,但肯定会指向正确的方向。

记住PDF和PostScript(文档)不会进行编辑,它们不会进行文本换行等,如果您需要放大缩放,则必须进行平移,它们存在以保留格式,适用于打印机等。

+0

@Smit自己想象出来。不过,感谢您提供有用的信息。看到答案。 – Rincewind