0
我已經尋找一個解決方案,以從MS-WORD, 產生PDF除去水印我已經使用溶液從以下link並且那對工作具有由Itext生成的水印的文件pdf從MS-WORD生成的PDF卸下水印
我已經尋找一個解決方案,以從MS-WORD, 產生PDF除去水印我已經使用溶液從以下link並且那對工作具有由Itext生成的水印的文件pdf從MS-WORD生成的PDF卸下水印
以下是僅針對文件的Apache PDFBox解決方案。它很可能不適用於其他文件,但值得一試。爲了理解我做了什麼,使用PDFBox PDFDebugger命令行應用程序(或使用itext RUPS)打開舊文件和新文件,並查看「內容」條目。
我刪除開始與
/Artifact << /Attached [ /Top ] /Type /Pagination /Subtype /Header >> BDC
以及但是一個也包含顏色和字體設置,所以我一直用這些
EMC
結束的一部分。在一個真實的文件中,這個段可能包含更多有用的數據(畢竟,它被命名爲「Header」)和不同類型的顏色設置,因此需要更多的邏輯。
PDDocument document = PDDocument.load(new File("Saura.pdf"));
if (document.isEncrypted())
{
System.err.println("Error: Encrypted documents are not supported for this example.");
System.exit(1);
}
for (PDPage page : document.getPages())
{
PDFStreamParser parser = new PDFStreamParser(page);
parser.parse();
List<Object> tokens = parser.getTokens();
List<Object> newTokens = new ArrayList<Object>();
List<Object> parameters = new ArrayList<Object>();
boolean skip = false;
// PDF content stream tokens have the forn
// paramater1...parameterN operator
for (Object token : tokens)
{
if (token instanceof Operator)
{
Operator op = (Operator) token;
if ("BDC".equals(op.getName()))
{
// "Watermark" starts with
// /Artifact << /Attached [ /Top ] /Type /Pagination /Subtype /Header >> BDC
if (parameters.size() == 2 && COSName.ARTIFACT.equals(parameters.get(0)) && parameters.get(1) instanceof COSDictionary)
{
COSDictionary dict = (COSDictionary) parameters.get(1);
if (COSName.getPDFName("Header").equals(dict.getItem(COSName.SUBTYPE)))
{
skip = true;
}
}
}
if (!skip || "g".equals(op.getName()) || "G".equals(op.getName()) || "Tf".equals(op.getName()))
{
// even when skipping, don't remove color and font settings
newTokens.addAll(parameters);
newTokens.add(op);
}
if ("EMC".equals(op.getName()))
{
// "Watermark" ends with EMC
skip = false;
}
parameters = new ArrayList<Object>();
}
else
{
parameters.add(token);
}
}
PDStream newContents = new PDStream(document);
OutputStream out = newContents.createOutputStream(COSName.FLATE_DECODE);
ContentStreamWriter writer = new ContentStreamWriter(out);
writer.writeTokens(newTokens);
out.close();
page.setContents(newContents);
}
document.save(new File("Saura2.pdf"));
該鏈接需要註冊。沒門。你想爲itext或pdfbox提供解決方案嗎?所有文件是由同一個源生成的嗎? –
@saurabhiitr據我所知,可以創建一個公共的Dropbox共享,它不需要註冊訪問。請這樣做。 – mkl
@TilmanHausherr解決方案從任何Api是歡迎.... – saurabhiitr