2013-07-16 43 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