iText页面颜色或黑色/白色
问题描述:
我试图找出PDF文档的页面是否包含任何没有黑色&使用iText的白色对象(或者可能是其他一些Java库if你知道任何)。 我的PDF文件不应该包含图像,所以我们不必担心。iText页面颜色或黑色/白色
任何想法?
我希望有一些其他的方式,比转换为图像和读取每个像素的颜色。
答
一个可能的解决方案是获取页面流并对颜色设置运算符进行正则表达式搜索。
byte[] contentStream = pdfRdr.getPageContent(pageNo);
几乎PDF页面上的所有内容都是文本或图形对象。颜色采用集中指定后最多四个浮点值运营商:
f1 .. fn SC % you need to know more about the colour space to determine whether this is black or not
fq .. fn sc
f1 f2 f3 RG % 0 0 0 would be black 1 1 1 would be white
f1 f2 f3 rg
f1 f2 f3 f4 K % CMYK (0 0 0 1 = Black, 0 0 0 0 = White, I think)
f1 f2 f3 f4 k
f1 g % the g operator choose the greyscale colour space
g1 G
我可以想像这可能会非常棘手得到的权利。更实用的解决方案可能是将页面转换为图像(使用许多可以谷歌搜索的工具之一),然后检查图像。
答
Apache PDFBox的一个可能的解决方案是创建一个图像并检查RGB像素。但要小心,即使PDF是纯b/w,渲染图像也可能包含灰度。
import java.awt.image.BufferedImage;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
...
public void checkColor(final File pdffile) {
PDDocument document = PDDocument.load(pdffile);
List<PDPage> pages = document.getDocumentCatalog().getAllPages();
for (int i = 0; i < pages.size(); i++) {
PDPage page = pages.get(i);
BufferedImage image = page.convertToImage(BufferedImage.TYPE_INT_RGB, 72);
for (int h = 0; h < image.getHeight(); h++) {
for (int w = 0; w < image.getWidth(); w++) {
int pixel = image.getRGB(w, h);
boolean color = isColorPixel(pixel);
// ... do something
}
}
}
}
private boolean isColorPixel(final int pixel) {
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
// gray: R = G = B
return !(red == green && green == blue);
}
我不知道任何lib可以帮助你,但我可以告诉你,itext将是有用的,因为当使用itext读取pdf时,所有格式都将被删除。 – user979490