Цветная страница iText или черный / белый - PullRequest
1 голос
/ 23 ноября 2011

Я пытаюсь выяснить, содержит ли страница документа PDF какие-либо черно-белые объекты (ч / б или цветные), используя iText (или, возможно, некоторые другие java-библиотеки, если вы их знаете). Мои PDF-файлы не должны содержать изображений, поэтому нам не нужно об этом беспокоиться.

Есть идеи?

Я надеюсь, что есть другой способ, кроме преобразования в изображение и считывания цвета каждого пикселя.

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Одним из возможных решений является получение потока страниц и поиск по регулярному выражению операторов настройки цвета.

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

Я могу представить, что это может быть сложно сделать правильно.Более прагматичным решением может быть преобразование страницы в изображение (с помощью одного из множества инструментов, для которого вы можете использовать Google), а затем проверка изображения.

0 голосов
/ 08 декабря 2011

Возможное решение с 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...