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

标签 java pdf itext grayscale

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

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

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

非常感谢!

最佳答案

我使用 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();

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

关于java - iText:将现有 PDF 的颜色更改为灰度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58954234/

相关文章:

java - 如何使用 Java 从数据库打印 Itext Pdf 报告上的印地语文本?

c# - iTextSharp 获取 PDF DPI

java - 对象Java的深拷贝

java - 如何在 Spring Boot Dockerized 应用程序中连接到特定的本地 MongoDB 实例?

javascript - 在 Meteor 中附加 base64 PDF 作为电子邮件附件

javascript - 如何销毁 PDFJS 对象?

c# - 将 PdfPCell 添加到段落

java - 使用Maven,如何正确部署依赖于J2EE/JPA JAR的WAR?

java - 显示每个可用的 JVM 的主类名称,如 VisualVM

ios - 纹理图集可以包含 PDF 图像吗?