2013-05-31 38 views
0

我在找一個pdf文件,將每個頁面的背景顏色設置爲黑色,將所有文本設置爲白色。使用iText選擇整個pdf文檔的文本和背景java

我這樣做最簡單的方法是什麼?是否有一個API調用來選擇每個頁面的背景和文件中的所有文本?或者我必須以某種方式遍歷每個頁面?

+1

首先,你必須分別對待每一頁。但現在麻煩開始了:名義上顯示PDF的背景是白色的。因此,爲了具有黑色背景,你必須添加黑色背景,例如通過在背部塗黑色矩形。但是現在有些PDF在每個頁面下都放置了一個白色的矩形。您必須識別並刪除該矩形或更改其顏色。此外,文本可以使用混合模式* multiply *或* darken *進行繪製。在這些情況下,您不得不考慮更改文本顏色,還要更改其混合模式。這是更難 – mkl

+0

任何機會,你知道如何做到這一切? – NathanTempelman

+0

對於itext,你首先需要使用一個PdfStamper進行操作。對於一般的黑色背景,您可以向UnderContent添加一個黑色矩形。但其他任務更加困難。不過,我還有另一個想法:理論上,在混合模式「差異」上在頁面內容上方繪製白色矩形就足夠了。我會研究一下。 – mkl

回答

2

正如我在上次評論,只要提到你的問題,畫中的混合模式下的白色矩形差異應該做的工作爲反轉所有顏色是你的任務足夠的解決方案:

void invert(File source, File target) throws IOException, DocumentException 
{ 
    PdfReader reader = new PdfReader(source.getPath()); 
    OutputStream os = new FileOutputStream(target); 
    PdfStamper stamper = new PdfStamper(reader, os); 
    invert(stamper); 
    stamper.close(); 
    os.close(); 
} 

void invert(PdfStamper stamper) 
{ 
    for (int i = stamper.getReader().getNumberOfPages(); i>0; i--) 
    { 
     invertPage(stamper, i); 
    } 
} 

void invertPage(PdfStamper stamper, int page) 
{ 
    Rectangle rect = stamper.getReader().getPageSize(page); 

    PdfContentByte cb = stamper.getOverContent(page); 
    PdfGState gs = new PdfGState(); 
    gs.setBlendMode(PdfGState.BM_DIFFERENCE); 
    cb.setGState(gs); 
    cb.setColorFill(new GrayColor(1.0f)); 
    cb.rectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight()); 
    cb.fill(); 

    cb = stamper.getUnderContent(page); 
    cb.setColorFill(new GrayColor(1.0f)); 
    cb.rectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight()); 
    cb.fill(); 
} 

invertPage確實在混合模式中繪製了上述白色矩形區域而不是頁面。此外,它通常在頁面下繪製一個白色矩形;至少對於我手中的Acrobat Reader版本來說,這是必需的。

您可能需要稍微調整一下代碼,以便更好地閱讀結果。也許混合模式排除BM_EXCLUSION)更合適,或者其他一些圖形狀態調整可以改善您的閱讀體驗。只是有創意! ;)

有關PDF混合模式的一些背景,你可能需要閱讀在PDF specification ISO 32000-1部分11.3.5 混合模式和研究iText in Action — 2nd Editiontransparency related examples

PS:此代碼僅反轉頁面內容。註釋不受影響。如果事實證明是必要的,你可能會做一些類似於他們的外觀流。

+0

我想在android應用程序中實現您的解決方案,我是否需要使用特定的端口itext來使用android?我在運行時遇到了一堆構建鏈接問題。 – NathanTempelman

+0

我還沒有在Android上使用過itext。有針對Android的itext的特殊端口,對於當前的itext版本,端口在itextpdf.com上可用。如果這是你的需求所需要的,我不知道。 – mkl

+0

我沒有看到它,雖然我看到一個名爲droidText的端口託管了其他地方。那是你在說什麼? – NathanTempelman