我有一个程序用于构建问题数据库。我正在为一个网站制作它,希望用户知道该网站已经下载了比赛。这就是为什么我希望输出为PDF - 几乎每个人都可以查看它,几乎没有人可以编辑它(并删除例如页脚或水印,与一些更简单的文件类型不同)。这就解释了为什么 HAS 是PDF。
该程序将被众多用户使用,这些用户将创建新数据库或扩展现有数据库。这就是为什么输出形成多文件是极其草率和低效的方式来实现我想要实现的目标(这会使用户复杂化)。
我想要做的是创建PDF文件,这些文件一旦创建就可以用我的程序编辑。
我想通过将我的程序可读的自定义文件类型实现到输出PDF中来实现这一点。
我提出了三种方法:
将文件附加到PDF,然后以一种只让PDF不知道它包含文件的方式破坏包含它的PDF部分,从而使用户无法注意到它(轻松地)。在阅读文档后,我将使用可能的PDF库之一恢复损坏和提取文件。
将文件隐藏在图像中,该图像将被添加到第一页或最后一页上的PDF somwhere,以某种方式(仍需要解决)隐藏在公众视线之外。知道它的位置,使用PDF库可以很容易地检索它。
据我所知,如果在PDF中添加“%”符号作为第一个字符,PDF阅读器将忽略整行(类似于Java中的“//”)(至少Adobe读者),使我能够在PDF中添加尽可能多的行(如果我知道在哪里,我这样做),最终用户会知道这一点。我可以通过这种方式将我的整个自定义文件实现为PDF。这里的问题是我实际上必须使用Java的一个输入读取器来阅读PDF,但我不确定是哪一个。我知道PDF不能像文本文件一样读取,因为它是一个二进制文件(对吧?)。
最后,我决定采用3号方法。 除非有人有更好的想法,条件是: 1.仅限一个文件。那个文件是PDF。 2.用户不得知道添加内容。
问题在于我不知道如何将PDF作为文件阅读(我不打算将其作为PDF阅读,我会使用PDF库来阅读。)
答案 0 :(得分:1)
在Java中,文本和二进制文件之间没有真正的区别,您可以将它们作为输入流读取。不同之处在于,对于二进制文件,您无法真正为它创建一个Reader,因为这假设有一种方法可以将字节流转换为unicode字符,而这对PDF文件不起作用。
因此,在您的情况下,您需要读取字节缓冲区中的文件并可能循环它们以扫描表示PDF中'%'和行尾字符的字节。
更好的方法是使用另一种现有的PDF格式数据编码方式:XMP标记。这允许任何类型的复杂键值对以XML编码并嵌入PDF,JPEG等中。请参阅http://partners.adobe.com/public/developer/en/xmp/sdk/XMPspecification.pdf。
Java中有一个开源库,可以让你操作它:http://pdfbox.apache.org/userguide/metadata.html。另请参阅另一位成功的人提出的相关问题:custom schema to XMP metadata或http://plindenbaum.blogspot.co.uk/2010/07/pdfbox-insertextract-metadata-frominto.html
答案 1 :(得分:0)
这只是1和0 - 只需使用RandomAccessFile并开始阅读。 PDF规范定义了有效的换行符(有几个)。抓取一个十六进制编辑器并打开一个PDF,你至少可以开始感受事物。请注意插入线条的位置 - 您需要将它们添加到文件的末尾,它们不会将外部参照表偏移量加到obj条目上。
以下是可能感兴趣的相关问题:PDF parsing file trailer
我建议您在startxref行之前立即发表评论。如果你把它放在其他任何地方,你可能会结束转移并打破外部参照表指针。
因此,插入特殊评论的简单算法将是:
转到文件末尾 向后搜索startxref 在startxref之前立即插入您的特殊注释 - 请务必在特殊注释的末尾插入换行符 保存PDF
您可以(并且应该)在十六进制编辑器中手动执行此操作。
非常重要:您的用户是否会保存对这些文件的更改?即如果他们填写表格字段,他们会打保存吗?如果是这样,您的注释行可能会在保存期间被删除(不同版本的不同PDF查看器在这方面可能会有不同的行为)。
XMP标记是执行您要执行的操作的正确方法 - 您可以嵌入整个XML段,我认为您很难想出一种无法表达为XML的数据结构。
我个人建议使用iText,但我有偏见(我是开发者之一)。 iText In Action一书中有一篇关于将XMP数据嵌入到PDF中的精彩章节。以下是本书的一些示例代码(我绝对推荐):http://itextpdf.com/examples/iia.php?id=217