讓我從重寫你的代碼開始,添加一個嵌入式文件。
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「一些測試文件」:
添加此文件後,現在需要將其移除。要做到這一點,請使用RUPS,並採取內部看看:
這使我們在哪裏可以找到嵌入的文件的提示。看看在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();
}
正如你所看到的,我們開始在文檔的根(又名目錄),我們通過Names
和EmbeddedFiles
行走到Names
陣列。據我所知,我想要刪除的嵌入文件是數組中的第一個,我通過刪除索引爲0的元素兩次來刪除名稱和值。首先刪除描述,然後刪除對該文件的引用。附件現在已經不復存在了:
由於沒有在我的例子只有一個嵌入的文件,我現在看到一個空數組,當我看PDF內:
如果您想要一次刪除所有嵌入的文件,代碼更容易。這顯示在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
字典這樣的條目:
是iText的免費的嗎?請讓我知道? – Naveen 2014-10-30 11:22:39
這是免費軟件,但這並不意味着它是免費的。如果您尊重AGPL,您可以使用iText而無需支付費用。這意味着您有義務在相同的AGPL許可下免費發佈您的源代碼。只要您將iText用於不是免費的項目,產品或服務,您應該購買商業許可證。請參閱http://itextpdf.com/salesfaq – 2014-10-30 11:25:59
感謝您的信息。 – Naveen 2014-10-30 11:27:02