2014-10-30 28 views
1

我是pdf新手,我使用以下代碼將文件嵌入到pdf中。但是,我想編寫另一個程序來刪除嵌入文件。我可以知道我該怎麼做?真的感謝!如何使用itext刪除PDF的附件

public void addAttachments(String src, String dest, String[] attachments) throws IOException,DocumentException { 
PdfReader reader = new PdfReader(src); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
for (int i = 0; i < attachments.length; i++) { 
     addAttachment(stamper.getWriter(), new File(attachments[i])); 
            } 
            stamper.close(); 
           } 

           protected void addAttachment(PdfWriter writer, File src) throws IOException { 
            PdfFileSpecification fs = 
            PdfFileSpecification.fileEmbedded(writer, src.getAbsolutePath(), src.getName(), null); 
            writer.addFileAttachment(src.getName().substring(0, src.getName().indexOf('.')), fs); 
           } 

回答

1

讓我從重寫你的代碼開始,添加一個嵌入式文件。

public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
    PdfReader reader = new PdfReader(src); 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
    PdfFileSpecification fs = PdfFileSpecification.fileEmbedded(
      stamper.getWriter(), null, "test.txt", "Some test".getBytes()); 
    stamper.addFileAttachment("some test file", fs); 
    stamper.close(); 
} 

你可以找到完整的代碼示例在這裏:AddEmbeddedFile

現在,當我們看生成的PDF的附件面板,我們看到的說明附件的test.txt「一些測試文件」:

enter image description here

添加此文件後,現在需要將其移除。要做到這一點,請使用RUPS,並採取內部看看:

enter image description here

這使我們在哪裏可以找到嵌入的文件的提示。看看在RemoveEmbeddedFile例子的代碼,看看我們是如何通過面向對象的文件格式瀏覽該PDF是:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
    PdfReader reader = new PdfReader(src); 
    PdfDictionary root = reader.getCatalog(); 
    PdfDictionary names = root.getAsDict(PdfName.NAMES); 
    PdfDictionary embeddedFiles = names.getAsDict(PdfName.EMBEDDEDFILES); 
    PdfArray namesArray = embeddedFiles.getAsArray(PdfName.NAMES); 
    namesArray.remove(0); 
    namesArray.remove(0); 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
    stamper.close(); 
} 

正如你所看到的,我們開始在文檔的根(又名目錄),我們通過NamesEmbeddedFiles行走到Names陣列。據我所知,我想要刪除的嵌入文件是數組中的第一個,我通過刪除索引爲0的元素兩次來刪除名稱和值。首先刪除描述,然後刪除對該文件的引用。附件現在已經不復存在了:

enter image description here

由於沒有在我的例子只有一個嵌入的文件,我現在看到一個空數組,當我看PDF內:

enter image description here

如果您想要一次刪除所有嵌入的文件,代碼更容易。這顯示在RemoveEmbeddedFiles例如:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
    PdfReader reader = new PdfReader(src); 
    PdfDictionary root = reader.getCatalog(); 
    PdfDictionary names = root.getAsDict(PdfName.NAMES); 
    names.remove(PdfName.EMBEDDEDFILES); 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
    stamper.close(); 
} 

現在我們甚至不看EmbeddedFiles字典的詞條。不再有在Names字典這樣的條目:

enter image description here

+0

是iText的免費的嗎?請讓我知道? – Naveen 2014-10-30 11:22:39

+2

這是免費軟件,但這並不意味着它是免費的。如果您尊重AGPL,您可以使用iText而無需支付費用。這意味着您有義務在相同的AGPL許可下免費發佈您的源代碼。只要您將iText用於不是免費的項目,產品或服務,您應該購買商業許可證。請參閱http://itextpdf.com/salesfaq – 2014-10-30 11:25:59

+0

感謝您的信息。 – Naveen 2014-10-30 11:27:02