iText:将现有 PDF 的颜色更改为灰度
iText: Change Colour of existing PDF to Grayscale
我们目前使用的是 Java 6 的旧版本 iText (2.x)。
我们现在尝试做的是打开现有的 PDF 并将其颜色更改为灰度。我找到方法 PdfWriter.setDefaultColorspace(PdfName key, PdfObject cs)
但我不太确定如何使用它。
谁能告诉我,如何正确使用它?或者也许有人知道如何使用这个旧的 iText 版本以另一种方式将 PDF 更改为灰度。
非常感谢!
我使用 iText 5.5.14 实现了这里的代码,但它也应该可以与 iText 2.1.7 一起使用,只需进行最小的更改。
有两种方法可以从 PDF 页面中删除颜色,
- 两者都实际遍历其内容流的所有颜色相关指令,并用等效的灰色替换其中设置的颜色
- 或者将指令附加到每个页面内容流,以消除现有指令创建的所有颜色饱和度。
前一个选项超出了堆栈溢出答案的范围(PDF 中有许多不同种类的颜色,嵌入的位图也会带来颜色,还必须考虑使用的透明度和混合模式的效果)但后一种选择相当容易实现,只需在混合模式下用灰度颜色覆盖页面 Saturation:
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 6 的旧版本 iText (2.x)。
我们现在尝试做的是打开现有的 PDF 并将其颜色更改为灰度。我找到方法 PdfWriter.setDefaultColorspace(PdfName key, PdfObject cs)
但我不太确定如何使用它。
谁能告诉我,如何正确使用它?或者也许有人知道如何使用这个旧的 iText 版本以另一种方式将 PDF 更改为灰度。
非常感谢!
我使用 iText 5.5.14 实现了这里的代码,但它也应该可以与 iText 2.1.7 一起使用,只需进行最小的更改。
有两种方法可以从 PDF 页面中删除颜色,
- 两者都实际遍历其内容流的所有颜色相关指令,并用等效的灰色替换其中设置的颜色
- 或者将指令附加到每个页面内容流,以消除现有指令创建的所有颜色饱和度。
前一个选项超出了堆栈溢出答案的范围(PDF 中有许多不同种类的颜色,嵌入的位图也会带来颜色,还必须考虑使用的透明度和混合模式的效果)但后一种选择相当容易实现,只需在混合模式下用灰度颜色覆盖页面 Saturation:
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();
注意,这是概念验证。对于完整的解决方案,您实际上必须对页面的所有注释执行相同的操作。