Java IText编辑或删除PDF上的图层

Java IText编辑或删除PDF上的图层,java,pdf,itext,layer,ocg,Java,Pdf,Itext,Layer,Ocg,好的 我正在使用IText在PDF上添加文本层。 现在我想编辑PDF上的现有图层,图层也仅由IText创建。似乎我没有这样的方法来支持 我想到的另一种方法是删除现有的层,并在其位置上放置新层。似乎IText也不支持删除。有办法吗 感谢您的支持。正如在评论中所显示的,所讨论的层实际上是iText所称的层,但实际上在PDF行话中称为可选内容组 在iText-Xtra包(不是extrajars,而是iText-Xtra.jar)中确实有一个用于删除这些层的实用程序类:它在同一个包中使用该类 /**

好的

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

我想到的另一种方法是删除现有的层,并在其位置上放置新层。似乎IText也不支持删除。有办法吗


感谢您的支持。

正如在评论中所显示的,所讨论的层实际上是iText所称的层,但实际上在PDF行话中称为可选内容组

在iText-Xtra包(不是extrajars,而是iText-Xtra.jar)中确实有一个用于删除这些层的实用程序类:它在同一个包中使用该类

/**
 * 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。

PDF本身没有层的概念。如果你在后台向PDF中添加了一些内容,你只需在现有内容之前添加它;对于前景,可以在其后附加它。也就是说,如果您真的只使用iText进行此类更改,则可以识别并删除这些更改集。它只需要使用iText低级API。或者您是否指的是iText所称的
PdfLayer
,它实际上是PDF行话中的可选内容组?是的,我说的是PdfLayer--使用它我将创建一个文本并将其放在PDF上,我们可以在PDF查看器工具上看到它是一个层次。我尝试过这个,但在com.itextpdf.text.PDF.PdfReader.getStreamBytes(PdfReader.java:2281)com.itextpdf.text.PDF.ocg.OCGParser.parse(OCGParser.java:132)com.itextpdf.text.PDF.ocg.OCGRemover.parse(OCGRemover.java:222)抛出异常java.lang.NullPointerException在com.itextpdf.text.pdf.ocg.OCGRemover.removeLayers(OCGRemover.java:81)上,你能提供一个复制问题的示例pdf吗?啊,我刚刚发现了NPE的一个可能原因:
OCGRemover.parse
uses
page.getAsStream(PdfName.CONTENTS)
检索页面内容。但是内容不需要是单个流,它们也可以是一个流数组,在这种情况下,
getAsStream
返回
null
,然后将其转发到
OCGParser。parse
解析内容,然后在
PdfReader.getStreamBytes期间在您的脸上爆炸。
确定,所以
OCGParser.parse
应该扩展以处理内容数组…哦,xtras有一个实验性的特征…可能你是真的..这个xtra对我没有帮助。如果你扩展它以处理数组,它也会有帮助。如果你提供了PDF,可能的原因可以得到验证。