2013-07-16 46 views
3

H全部,IText编辑或删除PDF上的图层

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

我想到的其他方式被删除现有的第二层,并在其位置上新层。似乎删除也不受IText支持。任何方式todo这些?

感谢adavance。

+0

PDF的装置不因为这样有层次的概念。如果您在后台向PDF添加内容,只需在现有内容之前添加它即可;对于前景,您可以在其后添加它。这就是说,如果你真的只用iText来做这种改变,这些改变集可以被识别和删除。它只需要使用iText低级别的API。 – mkl

+0

或者你是指iText称为“PdfLayer”,它实际上是PDF语言中的可选内容组? – mkl

+0

是的,我正在谈论PdfLayer - 使用这个我会创建一个文本并将其放置在PDF上,我们可以在PDF Viewer工具上看到它作为一个层 – JAVAC

回答

4

正如在评论中横空出世,有问题的层是什么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.

+0

是的,我试过这个,但抛出异常 java.lang.NullPointerException \t at com.itextpdf.text.pdf.PdfReader.getStreamBytes(PdfReader.java:2281) \t at com.itextpdf.text.pdf.ocg.OCGParser.parse(OCGParser.java:132) \t at com.itextpdf.text。 pdf.ocg.OCGRemover.parse(OCGRemover.java:222) \t at com.itextpdf.text.pdf.ocg.OCGRemover.removeLayers(OCGRemover.java:81 – JAVAC

+0

你能提供一个样本PDF来重现这个问题吗? – mkl

+0

啊,我刚刚发现了NPE的一个可能的原因:'OCGRemover.parse'使用'page.g etAsStream(PdfName.CONTENTS)'来检索页面内容。但内容不需要是单个流,它们也可以是流的数组,并且在这种情况下'getAsStream'返回'null',然后将其转发给'OCGParser.parse'来解析然后爆炸在'PdfReader.getStreamBytes.'好了,'OCGParser.parse'应该扩展到也处理内容阵列...哦好,外加功能有一个有点实验性质... – mkl