簡體   English   中英

使用iText java為整個pdf文檔選擇文本和背景

[英]Select text and background for entire pdf document using iText java

我想要一個pdf文件,將每個頁面的背景顏色設置為黑色,將所有文本設置為白色。

對我來說最簡單的方法是什么? 是否有api調用選擇每個頁面的背景和文件中的所有文本? 或者我必須以某種方式遍歷每個頁面?

正如我在上一篇評論中提到的那樣,在混合模式下繪制一個白色矩形只要反轉所有顏色是您的任務的充分解決方案, 差異就可以完成工作:

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確實繪制混合模式的差異頁面上述提到的白reactangle。 此外,它通常頁面下方繪制一個白色矩形; 至少對於我手邊的Acrobat Reader版本來說,這是必要的。

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

對於PDF混合模式中的某些背景,您可能需要閱讀PDF規范ISO 32000-1中的第11.3.5節混合模式 ,並研究iText in Action - 2nd Edition中透明度相關的示例

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM