2016-05-04 3 views
1

У меня возникла проблема с преобразованием некоторых цветных PDF-файлов в tiff-изображения. У PDF-файлов, с которыми у меня возникают проблемы, есть написанные вручную синие чернила. Эти подписи не появляются в сгенерированных двоичных tiff. Я подозреваю, что где-то есть пороговое значение, чтобы определить, какие пиксели будут черными, а какие будут белыми.Использование pdfbox для преобразования цветного PDF в b/w tiff

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

ответ

2

У меня была такая же проблема (синие подписи) некоторое время назад, и я сделал это:

  • воздавать RGB
  • новообращенного B/W с фильтром из JH Labs (я получил указал на это замечание в this answer)
  • сначала я попробовал дитеринг и диффузионной фильтр
  • фильтр, который работал лучше для меня был смещение части (я думаю, что я использовал 0.3) й e gain filter в сочетании с diffusion filter.
  • Вы можете комбинировать два фильтра с compound filter.
  • материал jhlabs не доступен как .jar файл, но вы можете загрузить исходный код и добавить его в проект
  • some examples

Btw, сохранять файлы не как LZW, но, как G4, что они сделают их меньше. PDFBox имеет методы для эффективного сохранения изображений, см. here. ImageIOUtil.writeImage() сохранит сжатый TIFF G4, если ваш BufferedImage имеет тип BITONAL.

+0

Благодарим за отзыв. Это дало мне представление об изображении как ImageType.GRAY, создав новое двоичное буферизуемое изображение и вычеркнув серое изображение в новое двоичное изображение. – Safford96

0

Я закончил рендеринг изображения в оттенках серого и перечеркнул его на второе изображение bw.

@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; 
    } 
} 
Смежные вопросы