2011-11-23 3 views
1

Je suis en train d'essayer de savoir si la page d'un document PDF contient aucun noir & objets blancs (page est b/w ou couleur) en utilisant iText (ou peut-être d'autres bibliothèques java si vous en connaissez). Mes fichiers PDF ne doivent pas contenir d'images, donc nous n'avons pas à nous en préoccuper.iText page couleur ou noir/blanc

Des idées? Je souhaite qu'il y ait un autre moyen que de convertir en une image et de lire la couleur de chaque pixel.

+0

Je ne connais pas de lib qui pourrait vous aider, mais je peux vous dire que itext sera très utile car lorsque vous lisez un pdf en utilisant itext tout le formatage est supprimé. – user979490

Répondre

1

Une solution possible consiste à obtenir le flux de la page et à effectuer une recherche regex pour les opérateurs de paramétrage de la couleur.

byte[] contentStream = pdfRdr.getPageContent(pageNo); 

Presque tout le contenu d'une page PDF est du texte ou un objet graphique. La couleur est définie à l'aide des opérateurs spécifiés après jusqu'à quatre valeurs à virgule flottante:

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 

Je peux imaginer que cela pourrait être difficile à obtenir le droit. Une solution plus pragmatique pourrait être de convertir la page en image (en utilisant l'un des nombreux outils que vous pouvez google pour) et ensuite inspecter l'image.

+0

Je pense que le chemin sur une image est plus sauvegarder et, comme vous le dites, plus pragmatique. Devrait être facile avec pdf-renderer (de java.net) ou apache pdfBox et le résultat awt.image. – chrise

+0

Une mise en œuvre C# de ce que Jimmy suggéré peut être trouvé ici: http://habjan.blogspot.com/2013/09/proof-of-concept-converting-pdf-files.html – HABJAN

0

Une solution possible avec Apache PDFBox est de créer une image et de vérifier les pixels RVB. Mais attention, l'image rendue peut contenir des niveaux de gris même si le PDF est en noir et blanc.

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