iText页面颜色或黑/白

时间:2011-11-23 14:03:43

标签: java pdf itext

我正在尝试使用iText(或者如果你知道的话,可能还有其他一些java库)来查明PDF文档的页面是否包含任何黑色和白色对象(页面是黑白或彩色)。 我的PDF文件不应包含图片,因此我们不必担心。

有什么想法吗?

我希望除了转换为图像和读取每个像素的颜色之外还有其他方法。

2 个答案:

答案 0 :(得分:1)

一种可能的解决方案是获取页面流并对颜色设置操作符进行正则表达式搜索。

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

我可以想象,要想做到这一点可能会很棘手。一个更实用的解决方案可能是将页面转换为图像(使用谷歌可以使用的许多工具之一),然后检查图像。

答案 1 :(得分:0)

Apache PDFBox的一个可能的解决方案是创建一个图像并检查像素RGB。但请注意,即使PDF是纯黑白,渲染图像也可能包含灰度。

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);
}