2016-05-04 67 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
  • に(私は尖っただ JH Labsからフィルタとwを/ bに
  • 変換をレンダリングthis answerのコメントで)
  • 私は最初にディザと拡散フィルタを試しました
  • 私にとって最も効果的なフィルタはバイアス部分(私は0.3を使ったと思います) e gain filterdiffusion filterを組み合わせたものです。
  • compound filterで2つのフィルタを組み合わせることができます。
  • jhlabsのものは.jarファイルとして使用することはできませんが、あなたはソースをダウンロードし、プロジェクトに追加します
  • some examples

ところで、LZWとしてあなたのファイルではなく、保存することができますが、G4として、そのそれらを小さくするでしょう。 PDFBoxには、画像に効率的に保存する方法があります(hereを参照)。 BufferedImageがBITONALタイプの場合、ImageIOUtil.writeImage()はG4圧縮TIFFに保存されます。

+0

感謝。これは、イメージをImageType.GRAYとしてレンダリングし、新しいバイナリのbufferedimageを作成し、グレーのイメージを新しいバイナリイメージに描画するというアイディアをもたらしました。 – 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; 
    } 
} 
関連する問題