1

我有一个程序将用于构建问题数据库。我正在为一个希望用户知道 contet 是从该站点下载的站点制作它。这就是为什么我希望输出为 PDF - 几乎每个人都可以查看它,几乎没有人可以编辑它(并删除例如页脚或水印,这与某些更简单的文件类型不同)。这就解释了为什么它必须是 PDF。

该程序将被众多用户使用,他们将创建新数据库或扩展现有数据库。这就是为什么将输出形成为多个文件是实现我想要实现的目标的极其草率和低效的方式(这会使用户的事情变得复杂)。

我想要做的是创建 PDF 文件,一旦创建,这些文件仍然可以用我的程序进行编辑。

我想通过将我的程序可读的自定义文件类型实现到输出 PDF 中来实现这一点。

我想出了三种方法:

  1. 将文件附加到 PDF,然后破坏包含它的 PDF 部分,这只会使 PDF 不知道它包含该文件,从而使用户无法(轻松地)注意到它。阅读文档后,我将使用可能的 PDF 库之一恢复损坏并提取文件。

  2. 将文件隐藏在图像中,该图像将被添加到 PDF 的第一页或最后一页的某个位置,以某种方式(仍然需要解决)隐藏在公众视线之外。知道它的位置,使用 PDF 库检索它应该很容易。

  3. 我了解到,如果您在 PDF 中的第一个字符中添加“%”符号,则 PDF 阅读器(至少 Adob​​e 阅读器)将忽略整行(类似于 Java 中的“//”),从而使我可以在 PDF 中添加尽可能多的行(如果我知道在哪里,我会这样做),而最终用户并不知道这一点。我可以通过这种方式将我的整个自定义文件实现为 PDF。这里的问题是我实际上必须使用 Java 的输入阅读器之一阅读 PDF,但我不确定是哪一个。我知道 PDF 不能像文本文件一样读取,因为它是二进制文件(对吗?)。

最后,我决定采用方法3。除非有人有更好的想法,而且条件是:1。只有一个文件。该文件是PDF。2.用户必须不知道添加。

问题是我不知道如何将 PDF 作为文件读取(我不想将其作为 PDF 读取,我会使用 PDF 库来读取)。

  1. 那么,有人有更好的主意吗?
  2. 如果不是,我如何将 PDF 读取为FILE,因此输出是字符数组(带有换行符检测),然后用我的内容添加重写整个文件?
4

2 回答 2

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。另请参阅另一个成功的人提出的相关问题:自定义模式到 XMP 元数据http://plindenbaum.blogspot.co.uk/2010/07/pdfbox-insertextract-metadata-frominto.html

于 2012-09-06T22:08:17.537 回答
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

于 2012-09-07T05:04:22.423 回答