【问题标题】:IText edit or remove the layer on PDFIText 编辑或删除 PDF 上的图层
【发布时间】:2013-07-16 21:51:47
【问题描述】:

全部,

我正在使用 IText 在 PDF 上添加文本层。 现在我想编辑 PDF 上的现有图层,图层也仅由 IText 创建。似乎 IText 没有这样的方法来支持。

我想到的其他方法是删除现有图层并在其位置放置新图层。似乎 IText 也不支持删除。有什么办法做到这些吗?

提前致谢。

【问题讨论】:

  • PDF 本身没有层的概念。如果您在后台向 PDF 添加内容,只需将其添加到现有内容之前;对于前景,您在之后附加它。说了这么多,如果真的只用iText来做这样的改动,这些改动集是可以被识别和移除的。它只需要使用 iText 低级 API。
  • 或者你指的是iText所谓的PdfLayer,它实际上是PDF术语中的可选内容组?
  • 是的,我说的是 PdfLayer——使用它我将创建一个文本并将其放置在 PDF 上,我们可以在 PDF 查看器工具上看到它作为一个图层

标签: java pdf itext layer ocg


【解决方案1】:

正如在 cmets 中所证明的那样,有问题的层实际上是 iText 所谓的层,但实际上在 PDF 术语中称为 可选内容组。

在 iText Xtra 包中确实有一个用于删除此类层的实用程序类(不是 extrajars,而是 itext-xtra.jar):com.itextpdf.text.pdf.ocg.OCGRemover,它使用了同一包中的类 OCGParser

/**
 * Class that knows how to remove OCG layers.
 */
public class OCGRemover
{
    /**
     * Removes layers from a PDF document
     * @param reader    a PdfReader containing a PDF document
     * @param layers    a sequence of names of OCG layers
     * @throws IOException
     */
    public void removeLayers(PdfReader reader, String... layers) throws IOException
    [...]
}

将该方法应用于PdfReader 后,您显然必须保存更改,例如通过PdfStamper.

【讨论】:

  • 是的,我试过这个,但在 com.itextpdf.text.pdf.ocg 的 com.itextpdf.text.pdf.PdfReader.getStreamBytes(PdfReader.java:2281) 处抛出异常 java.lang.NullPointerException。 OCGParser.parse(OCGParser.java:132) 在 com.itextpdf.text.pdf.ocg.OCGRemover.parse(OCGRemover.java:222) 在 com.itextpdf.text.pdf.ocg.OCGRemover.removeLayers(OCGRemover.java: 81
  • 您能否提供一个示例 PDF 来重现该问题?
  • 啊,我刚刚发现了 NPE 的一个可能原因:OCGRemover.parse 使用 page.getAsStream(PdfName.CONTENTS) 检索页面内容。但是内容不需要是单个流,它们也可能是流数组,在这种情况下getAsStream 返回null,然后转发到OCGParser.parse 进行解析,然后在@ 期间在你的脸上爆炸987654333@ 好的,所以OCGParser.parse 应该扩展为也处理内容数组...哦,好吧,xtras 有点实验性质...
  • 也许你是真的.. 这个 xtra 对我没有帮助。
  • 如果你也扩展它来处理数组,它确实有帮助。如果您提供了 PDF,则可以验证可能的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
相关资源
最近更新 更多