2016-05-04 95 views
1

Ich habe ein kleines Problem mit der Konvertierung einiger Farb-PDFs in tiff Bilder. Die PDFs, mit denen ich Probleme habe, haben handschriftliche Unterschriften in blauer Tinte. Diese Signaturen erscheinen nicht in den generierten binären Tiffs. Ich vermute, es gibt irgendwo einen Schwellenwert, um festzustellen, welche Pixel schwarz und welche weiß sind.Mit pdfbox ein Farb-PDF in ein s/w-TIFF konvertieren

@SuppressWarnings("serial") 
private static void convertPdfToTiff(final File pdf, final File tif) throws Exception { 
    try 
    { 
     final Iterator<ImageWriter> imageWriterIterator = ImageIO.getImageWritersByFormatName("TIF"); 
     final ImageWriter imageWriter = imageWriterIterator.hasNext() ? imageWriterIterator.next() : null; 

     final TIFFImageWriteParam writeParam = new TIFFImageWriteParam(Locale.getDefault()); 
     writeParam.setCompressionMode(TIFFImageWriteParam.MODE_EXPLICIT); 
     writeParam.setCompressionType("LZW"); 

     PDDocument pdfDocument = PDDocument.load(pdf); 
     PDFRenderer pdfRenderer = new PDFRenderer(pdfDocument); 

     OutputStream out = new FileOutputStream(tif); 
     final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out); 
     final ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(bufferedOutputStream); 
     imageWriter.setOutput(imageOutputStream); 
     imageWriter.prepareWriteSequence(null); 

     int pageCounter = 0; 
     for (PDPage page : pdfDocument.getPages()) 
     { 
      BufferedImage image = pdfRenderer.renderImageWithDPI(pageCounter, 300, ImageType.BINARY); 

      final IIOImage s = new IIOImage(image, null, new TIFFImageMetadata(new TIFFIFD(new Vector<BaselineTIFFTagSet>() 
      { 
       { 
         add(BaselineTIFFTagSet.getInstance()); 
       } 
      }))) 

      { 
       { 
         final TIFFImageMetadata tiffMetadata = (TIFFImageMetadata) getMetadata(); 
         final TIFFIFD rootIFD = tiffMetadata.getRootIFD(); 
         final BaselineTIFFTagSet base = BaselineTIFFTagSet.getInstance(); 
         rootIFD.addTIFFField(new TIFFField(base.getTag(BaselineTIFFTagSet.TAG_X_RESOLUTION), TIFFTag.TIFF_RATIONAL, 1, new long[][] { { 300, 1 } })); 
         rootIFD.addTIFFField(new TIFFField(base.getTag(BaselineTIFFTagSet.TAG_Y_RESOLUTION), TIFFTag.TIFF_RATIONAL, 1, new long[][] { { 300, 1 } })); 
       } 
      }; 

      imageWriter.writeToSequence(s, writeParam); 
      pageCounter++; 
     } 

     imageWriter.dispose(); 
     imageOutputStream.flush(); 
     imageOutputStream.close(); 
     bufferedOutputStream.flush(); 
     bufferedOutputStream.close(); 
     pdfDocument.close(); 
     out.flush(); 
     out.close(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     throw e; 
    } 
} 

Antwort

2

ich das gleiche Problem (blau Unterschriften) hatte vor einiger Zeit und ich habe dies:

  • zu RGB
  • convert machen mit einem Filter b/w von JH Labs (habe ich darauf um dies durch einen Kommentar in this answer)
  • ich zunächst versucht, das Zitter und die Diffusionsfilter
  • die Filter, der am besten für mich gearbeitet, um den Bias-Teil war (ich glaube, ich 0,3 verwendet) von th e gain filter kombiniert mit der diffusion filter.
  • können Sie zwei Filter mit der compound filter kombinieren.
  • das jhlabs Zeug ist als .jar-Datei nicht verfügbar, aber die Quellen herunterladen und fügen Sie es zu einem Projekt
  • some examples

Btw, speichern Sie Ihre Dateien nicht als LZW, sondern als G4, dass werde sie kleiner machen. PDFBox verfügt über Methoden zum effizienten Speichern in Bildern, siehe here. ImageIOUtil.writeImage() speichert in G4 komprimierte TIFF, wenn BufferedImage vom Typ BITONAL ist.

+0

Danke für die Antwort. Das brachte mich auf die Idee, das Bild als ImageType.GRAY zu rendern, während ich ein neues binäres gepuffertes Bild erstelle und das graue Bild in das neue Binärbild zeichne. – Safford96

0

Ich beendete das Rendern des Bildes als Graustufen und erneutes Zeichnen zu einem zweiten BW-Bild.

@SuppressWarnings("serial") 
private static void convertPdfToTiff(final File pdf, final File tif) throws Exception { 
    try 
    { 
     final Iterator<ImageWriter> imageWriterIterator = ImageIO.getImageWritersByFormatName("TIF"); 
     final ImageWriter imageWriter = imageWriterIterator.hasNext() ? imageWriterIterator.next() : null; 

     final TIFFImageWriteParam writeParam = new TIFFImageWriteParam(Locale.getDefault()); 
     writeParam.setCompressionMode(TIFFImageWriteParam.MODE_EXPLICIT); 
     writeParam.setCompressionType("CCITT T.6"); 

     PDDocument pdfDocument = PDDocument.load(pdf); 
     PDFRenderer pdfRenderer = new PDFRenderer(pdfDocument); 

     OutputStream out = new FileOutputStream(tif); 
     final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out); 
     final ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(bufferedOutputStream); 
     imageWriter.setOutput(imageOutputStream); 
     imageWriter.prepareWriteSequence(null); 

     int pageCounter = 0; 
     for (PDPage page : pdfDocument.getPages()) 
     { 
      BufferedImage image = pdfRenderer.renderImageWithDPI(pageCounter, 300, ImageType.GRAY); 
      BufferedImage image2 = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_BINARY); 
      Graphics2D g = image2.createGraphics(); 
      g.drawRenderedImage(image, null); 
      g.dispose(); 

      final IIOImage s = new IIOImage(image2, null, new TIFFImageMetadata(new TIFFIFD(new Vector<BaselineTIFFTagSet>() 
      { 
       { 
         add(BaselineTIFFTagSet.getInstance()); 
       } 
      }))) 

      { 
       { 
         final TIFFImageMetadata tiffMetadata = (TIFFImageMetadata) getMetadata(); 
         final TIFFIFD rootIFD = tiffMetadata.getRootIFD(); 
         final BaselineTIFFTagSet base = BaselineTIFFTagSet.getInstance(); 
         rootIFD.addTIFFField(new TIFFField(base.getTag(BaselineTIFFTagSet.TAG_X_RESOLUTION), TIFFTag.TIFF_RATIONAL, 1, new long[][] { { 300, 1 } })); 
         rootIFD.addTIFFField(new TIFFField(base.getTag(BaselineTIFFTagSet.TAG_Y_RESOLUTION), TIFFTag.TIFF_RATIONAL, 1, new long[][] { { 300, 1 } })); 
       } 
      }; 

      imageWriter.writeToSequence(s, writeParam); 
      pageCounter++; 
     } 

     imageWriter.dispose(); 
     imageOutputStream.flush(); 
     imageOutputStream.close(); 
     bufferedOutputStream.flush(); 
     bufferedOutputStream.close(); 
     pdfDocument.close(); 
     out.flush(); 
     out.close(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     throw e; 
    } 
}