iText:将现有PDF的颜色更改为灰度

问题描述 投票:1回答:1

目前,我们在Java 6中使用旧版本的iText(2.x)。

我们现在尝试做的是打开一个现有的PDF,然后将其颜色更改为灰度。我找到了方法PdfWriter.setDefaultColorspace(PdfName key, PdfObject cs)但我不确定如何使用它。

谁能告诉我,如何以正确的方式使用它?也许任何人都知道如何使用此旧iText版本以另一种方式将PDF更改为灰度。

非常感谢!

java pdf itext grayscale
1个回答
0
投票

[我在这里使用iText 5.5.14实现了代码,但它也应该与iText 2.1.7一起使用,而只需进行很少的更改。

有两种方法可以去除PDF页面的颜色,

  • 一个人实际上都会遍历其内容流中所有与颜色相关的指令,并用等效的灰色替换其中设置的颜色
  • 或一个将指令附加到每个页面内容流,以消除现有指令创建的所有内容的颜色饱和度。

前一种选择超出了堆栈溢出答案的范围(PDF中有许多种不同的颜色,嵌入式位图也带来了颜色,而且还必须考虑所使用的透明度和混合模式的影响),但是后者通过在混合模式饱和度

中用灰度颜色覆盖页面,可以很容易地实现该选项
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();

请注意,这是一个概念证明。对于完整的解决方案,您实际上必须对页面的所有注释执行相同的操作。

© www.soinside.com 2019 - 2024. All rights reserved.