我使用IText在PDF上添加文本图层。 现在我想编辑PDF上的现有图层,图层也仅由IText创建。似乎IText没有这样的方法来支持。
我想到的其他方式被删除现有的第二层,并在其位置上新层。似乎删除也不受IText支持。任何方式todo这些?
感谢adavance。
我使用IText在PDF上添加文本图层。 现在我想编辑PDF上的现有图层,图层也仅由IText创建。似乎IText没有这样的方法来支持。
我想到的其他方式被删除现有的第二层,并在其位置上新层。似乎删除也不受IText支持。任何方式todo这些?
感谢adavance。
正如在评论中横空出世,有问题的层是什么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.
是的,我试过这个,但抛出异常 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
你能提供一个样本PDF来重现这个问题吗? – mkl
啊,我刚刚发现了NPE的一个可能的原因:'OCGRemover.parse'使用'page.g etAsStream(PdfName.CONTENTS)'来检索页面内容。但内容不需要是单个流,它们也可以是流的数组,并且在这种情况下'getAsStream'返回'null',然后将其转发给'OCGParser.parse'来解析然后爆炸在'PdfReader.getStreamBytes.'好了,'OCGParser.parse'应该扩展到也处理内容阵列...哦好,外加功能有一个有点实验性质... – mkl
PDF的装置不因为这样有层次的概念。如果您在后台向PDF添加内容,只需在现有内容之前添加它即可;对于前景,您可以在其后添加它。这就是说,如果你真的只用iText来做这种改变,这些改变集可以被识别和删除。它只需要使用iText低级别的API。 – mkl
或者你是指iText称为“PdfLayer”,它实际上是PDF语言中的可选内容组? – mkl
是的,我正在谈论PdfLayer - 使用这个我会创建一个文本并将其放置在PDF上,我们可以在PDF Viewer工具上看到它作为一个层 – JAVAC