2016-10-05 57 views
0

我已經尋找一個解決方案,以從MS-WORD, 產生PDF除去水印我已經使用溶液從以下link並且那對工作具有由Itext生成的水印的文件pdf從MS-WORD生成的PDF卸下水印

+1

該鏈接需要註冊。沒門。你想爲itext或pdfbox提供解決方案嗎?所有文件是由同一個源生成的嗎? –

+0

@saurabhiitr據我所知,可以創建一個公共的Dropbox共享,它不需要註冊訪問。請這樣做。 – mkl

+0

@TilmanHausherr解決方案從任何Api是歡迎.... – saurabhiitr

回答

0

以下是僅針對文件的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"));