簡體   English   中英

iText:將現有 PDF 的顏色更改為灰度

[英]iText: Change Colour of existing PDF to Grayscale

我們目前正在使用舊版本的 iText (2.x) 和 Java 6。

我們現在嘗試做的是打開一個現有的 PDF 並將其顏色更改為灰度。 我找到了方法PdfWriter.setDefaultColorspace(PdfName key, PdfObject cs)但我不確定如何使用它。

誰能告訴我,如何以正確的方式使用它? 或者也許有人知道如何使用這個舊的 iText 版本以另一種方式將 PDF 更改為灰度。

提前謝謝了!

我在這里使用 iText 5.5.14 實現了代碼,但它也應該與 iText 2.1.7 一起使用,只需進行少量更改。

有兩種方法可以從 PDF 頁面中去除顏色,

  • 任何一個實際上都遍歷其內容流的所有與顏色相關的指令,並將其中設置的 colors 替換為等效的灰色
  • 或者將指令附加到每個頁面內容 stream 中,從而消除現有指令創建的所有顏色飽和度。

前一個選項超出了堆棧溢出答案的 scope (PDF 中有許多不同類型的 colors,嵌入式位圖也帶來了顏色,並且還必須考慮使用的透明度和混合模式的影響)但后一個選項是通過在混合模式飽和度下用灰度顏色覆蓋頁面來實現相當容易:

void dropSaturation(PdfStamper pdfStamper) {
    PdfGState gstate = new PdfGState();
    gstate.setBlendMode(PdfName.SATURATION);
    PdfReader pdfReader = pdfStamper.getReader();
    for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) {
        PdfContentByte canvas = pdfStamper.getOverContent(i);
        canvas.setGState(gstate);
        Rectangle mediaBox = pdfReader.getPageSize(i);
        canvas.setColorFill(BaseColor.BLACK);
        canvas.rectangle(mediaBox.getLeft(), mediaBox.getBottom(), mediaBox.getWidth(), mediaBox.getHeight());
        canvas.fill();
        canvas = pdfStamper.getUnderContent(i);
        canvas.setColorFill(BaseColor.WHITE);
        canvas.rectangle(mediaBox.getLeft(), mediaBox.getBottom(), mediaBox.getWidth(), mediaBox.getHeight());
        canvas.fill();
    }
}

ColorToGray方法)

您可以像這樣應用它:

PdfReader pdfReader = new PdfReader(SOURCE_PDF);
PdfStamper pdfStamper = new PdfStamper(pdfReader, RESULT_STREAM);
dropSaturation(pdfStamper);
pdfStamper.close();

請注意,這是一個概念驗證。 對於完整的解決方案,您實際上必須對頁面的所有注釋執行相同的操作。

暫無
暫無

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

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