【问题标题】:Creating a invisible PDF object with iText使用 iText 创建不可见的 PDF 对象
【发布时间】:2012-09-11 09:21:55
【问题描述】:

我有一个输出为 PDF 的程序,但是,我希望它能够从中读取。

我想出了我自己的数据类型,我的程序能够读取它,但我需要它以某种方式包含在 PDF 文件中(没有多个文件,我希望每个输出一个文件)。 我还需要让这些数据对用户不可见且无法检测到。

我听说过一些关于 PDF 词典的信息,但我不知道该怎么做(或者是否有其他方法)。我不想使用 XMP/XML 文件,我的数据比键值更复杂。

如果有人给我写了几行示例代码,我可以:

  • 使用 iText 向 PDF 添加新词典
  • 使用 iText 填充数据
  • 使用 iText 在文件中定位它
  • 使用 iText 从中读取

【问题讨论】:

  • XML 可以存储非常复杂的数据,而且它通常会这样做
  • 有没有办法以用户看不到的方式将其嵌入到 PDF 中?

标签: java pdf itext


【解决方案1】:

您想做一些类似于 Adob​​e Illustrator 正在做的事情。如果您从 Adob​​e Illustrator 创建 PDF,则可以封装原始 AI 文件。这给您的印象是可以编辑 PDF。实际上,Adobe Illustrator 获取 AI 文件并使用它进行编辑,并从更新的 AI 重新创建 PDF。

这些信息存储在哪里?请参阅 ISO-32000-1 第 14.5 节:

合格的产品可以使用这本字典作为存储的地方 与该文档、页面或表格相关的私人数据。这样的 私人数据可以传达对遵从者有意义的信息 产生它的产品(例如关于对象分组的信息 Adobe Photoshop® 使用的图形编辑器或图层信息)但 通用的符合标准的读者可能会忽略它。

我不确定这里问的是什么。如果您要像我上面回答的那样寻求建议:例如,将 PieceInfo 条目添加到根字典(又名目录)。这都是有据可查的,不是吗?阅读 ISO 规范,并阅读“iText in Action”的第 4 部分。

如果您的问题是:为我编写一些代码来完成我需要做的事情。那么我认为这或多或少违反了本网站的目标。

【讨论】:

  • 对于最后一部分,我的意思是:iTextClassINeed.createNewDictionary(args); iTextClassINeed.addNewlineToDictionary(args);然后我会去探索 iTextClassINeed 以获取更多信息......
  • 我的回答暗示:不要创建新字典!使用 ISO-32000-1 中建议的语法并将 Page-Piece Dictionary 添加到目录中。如何?通过使用 PdfWriter.getExtraCatalog() 并添加 Piece-Info 字典。如何创建 Piece-Info 字典?呃...为什么不使用 new PdfDictionary()?
【解决方案2】:

您可以将数据十六进制编码为字符串,然后像这样将其从屏幕上绘制出来:

cb.showTextAligned(PdfContentByte.ALIGN_LEFT,"HIDDENDATA_"+ hexencodeddata, 2000f,2000f, 0f);

并读取处理所有搜索 HIDDENDATA_ 的字符串

另一种方法是使用注解

 public void addAnnotation(PdfWriter writer,
        Document document, Rectangle rect, String text) {
        PdfAnnotation annotation = new PdfAnnotation(writer,
            new Rectangle(
                rect.getRight() + 10, rect.getBottom(),
                rect.getRight() + 30, rect.getTop()));
        annotation.setTitle("Text annotation");
        annotation.put(PdfName.SUBTYPE, PdfName.TEXT);
        annotation.put(PdfName.OPEN, PdfBoolean.PDFFALSE);

        annotation.put(PdfName.NAME, new PdfName(text));
        writer.addAnnotation(annotation);
    }

然后使用类似这样的方式阅读。

http://downloads.snowtide.com/javadoc/PDFTextStream/2.3.2/com/snowtide/pdf/PDFTextStream.html

【讨论】:

  • 我不会对此投反对票,但这是个糟糕的建议:注释将显示在 Adob​​e Reader 中。使用十六进制编码数据并将其写入页面的可见区域之外被认为是对 PDF 的“不当使用”。如果 ISO-32000-1 提供了一种存储私有数据的机制,为什么不使用 if?
  • 我同意你的观点,这只是另一种方式。您之前的回答是最好的方式,但即使 PDF 支持私有数据,有时您也不想建议有私有数据,这是一种更离散的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 2019-04-11
相关资源
最近更新 更多