2011-11-23 4 views
1

iText를 사용하여 PDF 문서의 페이지에 아무 것도없는 검은 색 & 흰색 객체 (페이지가 흑백 또는 컬러)가 포함되어 있는지 알아 내려고 if if (또는 다른 java 라이브러리 인 경우 if 당신은 무엇이든을 안다). 내 PDF 파일에 이미지가 없어야하므로 걱정할 필요가 없습니다.iText 페이지 색상 또는 검정색/흰색

아이디어가 있으십니까?

이미지로 변환하고 모든 픽셀의 색상을 읽는 것 외에 다른 방법이 있기를 바랍니다.

+0

나는 당신을 도울 수있는 lib 디렉토리를 모르지만, itext는 도움이 될 것이라고 말할 수 있습니다. 왜냐하면 itext를 사용하여 pdf를 읽을 때 모든 서식이 제거되기 때문입니다. – user979490

답변

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 

나는 이것이 바로 얻을 까다로운 일이 될 수 상상할 수있다. 좀 더 실용적인 해결책은 페이지를 이미지로 변환하고 (Google이 할 수있는 여러 도구 중 하나를 사용하여) 이미지를 검사하는 것입니다.

+0

나는 이미지를 넘어서는 길은 더 많이 절약되고 있다고 생각한다. pdf-renderer (java.net) 또는 apache pdfBox 및 결과 awt.image를 사용하여 쉬워야합니다. – chrise

+0

지미가 제안한 C# 구현은 http://habjan.blogspot.com/2013/09/proof-of-concept-converting-pdf-files.html에서 찾을 수 있습니다. – HABJAN

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