2013-08-12 126 views
15

PDF文書を画像に変換したいと思っていました。私はGhost4jを使用していました。PDFファイルを画像に変換する

問題: Ghost4Jは、実行時にgsdll32.dllファイルを必要とし、私ははないがdllファイルを使用したいです。

質問1: dhostなしで画像を変換するghost4jには何らかの方法がありますか?

質問2:解決策はPDFBox APIで見つかりました。 org.apache.pdfbox.pdmodel.PDPagep have method convertToImage() `は、PDFページを画像フォーマットに変換します。

PDDocument doc = PDDocument.load(new File("/document.pdf")); 
List<PDPage>pages = doc.getDocumentCatalog().getAllPages(); 
PDPage page = pages.get(0); 
BufferedImage image =page.convertToImage(); 
File outputfile = new File("/image.png"); 
ImageIO.write(image, "png", outputfile); 
doc.close(); 

私はPDF文書にテキストしかありません。このコードを実行すると例外が発生します。

Aug 12, 2013 6:00:24 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: BDC 
Exception in thread "main" java.lang.ExceptionInInitializerError 
    at org.apache.pdfbox.pdmodel.font.PDTrueTypeFont.getawtFont(PDTrueTypeFont.java:481) 
    at org.apache.pdfbox.pdmodel.font.PDSimpleFont.drawString(PDSimpleFont.java:109) 
    at org.apache.pdfbox.pdfviewer.PageDrawer.processTextPosition(PageDrawer.java:235) 
    at org.apache.pdfbox.util.PDFStreamEngine.processEncodedText(PDFStreamEngine.java:496) 
    at org.apache.pdfbox.util.operator.ShowTextGlyph.process(ShowTextGlyph.java:62) 
    at org.apache.pdfbox.util.PDFStreamEngine.processOperator(PDFStreamEngine.java:554) 
    at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:268) 
    at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:235) 
    at org.apache.pdfbox.util.PDFStreamEngine.processStream(PDFStreamEngine.java:215) 
    at org.apache.pdfbox.pdfviewer.PageDrawer.drawPage(PageDrawer.java:125) 
    at org.apache.pdfbox.pdmodel.PDPage.convertToImage(PDPage.java:781) 
    at org.apache.pdfbox.pdmodel.PDPage.convertToImage(PDPage.java:712) 
    at ge.eid.esignature.adessa.pades.sign.PDFtoImage.main(PDFtoImage.java:25) 
Caused by: java.lang.IllegalArgumentException 
    at java.nio.Buffer.position(Buffer.java:216) 
    at sun.font.TrueTypeFont.lookupName(TrueTypeFont.java:1153) 
    at sun.font.TrueTypeFont.getPostscriptName(TrueTypeFont.java:1205) 
    at java.awt.Font.getPSName(Font.java:1156) 
    at org.apache.pdfbox.pdmodel.font.FontManager.loadFonts(FontManager.java:101) 
    at org.apache.pdfbox.pdmodel.font.FontManager.<clinit>(FontManager.java:53) 
    ... 13 more 

答えて

25

04-Request-Headers.pdfファイルページをイメージ形式に簡単に変換できます。

すべてのpdfページをPDFボックスを使用してJavaでイメージフォーマットに変換します。 jpg, jpeg, png, bmp, gifフォーマットへの画像の

package com.pdf.pdfbox.examples; 

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.util.List; 

import javax.imageio.ImageIO; 

import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 

@SuppressWarnings("unchecked") 
public class ConvertPDFPagesToImages { 
    public static void main(String[] args) { 
     try { 
     String sourceDir = "C:/Documents/04-Request-Headers.pdf"; // Pdf files are read from this folder 
     String destinationDir = "C:/Documents/Converted_PdfFiles_to_Image/"; // converted images from pdf document are saved here 

     File sourceFile = new File(sourceDir); 
     File destinationFile = new File(destinationDir); 
     if (!destinationFile.exists()) { 
      destinationFile.mkdir(); 
      System.out.println("Folder Created -> "+ destinationFile.getAbsolutePath()); 
     } 
     if (sourceFile.exists()) { 
      System.out.println("Images copied to Folder: "+ destinationFile.getName());    
      PDDocument document = PDDocument.load(sourceDir); 
      List<PDPage> list = document.getDocumentCatalog().getAllPages(); 
      System.out.println("Total files to be converted -> "+ list.size()); 

      String fileName = sourceFile.getName().replace(".pdf", "");    
      int pageNumber = 1; 
      for (PDPage page : list) { 
       BufferedImage image = page.convertToImage(); 
       File outputfile = new File(destinationDir + fileName +"_"+ pageNumber +".png"); 
       System.out.println("Image Created -> "+ outputfile.getName()); 
       ImageIO.write(image, "png", outputfile); 
       pageNumber++; 
      } 
      document.close(); 
      System.out.println("Converted Images are saved at -> "+ destinationFile.getAbsolutePath()); 
     } else { 
      System.err.println(sourceFile.getName() +" File not exists"); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

可能な変換:

ジャーが

pdfbox-1.8.3.jarまたはMavenの依存ここ

<dependency> 
    <groupId>org.apache.pdfbox</groupId> 
    <artifactId>pdfbox</artifactId> 
    <version>1.8.3</version> 
</dependency> 

を必要ソリューションです。

注:私は、主に使用される画像フォーマットについて述べました。

ImageIO.write(image , "jpg", new File(destinationDir +fileName+"_"+pageNumber+".jpg")); 
ImageIO.write(image , "jpeg", new File(destinationDir +fileName+"_"+pageNumber+".jpeg")); 
ImageIO.write(image , "png", new File(destinationDir +fileName+"_"+pageNumber+".png")); 
ImageIO.write(image , "bmp", new File(destinationDir +fileName+"_"+pageNumber+".bmp")); 
ImageIO.write(image , "gif", new File(destinationDir +fileName+"_"+pageNumber+".gif")); 

コンソール出力:

org.apache.pdfbox.util.PDFStreamEngine processOperator INFO: unsupported/disabled operation

あなたは、Apacheから離れてクラスパスにfontbox-1.7.1 jarファイルをインクルードする必要があります。エラーの場合

Images copied to Folder: Converted_PdfFiles_to_Image 
Total files to be converted -> 13 
Aug 06, 2014 1:35:49 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_1.png 
Aug 06, 2014 1:35:50 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_2.png 
Aug 06, 2014 1:35:51 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_3.png 
Aug 06, 2014 1:35:51 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_4.png 
Aug 06, 2014 1:35:52 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_5.png 
Aug 06, 2014 1:35:52 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_6.png 
Aug 06, 2014 1:35:53 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_7.png 
Aug 06, 2014 1:35:53 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_8.png 
Aug 06, 2014 1:35:54 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_9.png 
Aug 06, 2014 1:35:54 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_10.png 
Aug 06, 2014 1:35:54 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_11.png 
Aug 06, 2014 1:35:55 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_12.png 
Aug 06, 2014 1:35:55 PM org.apache.pdfbox.util.PDFStreamEngine processOperator 
INFO: unsupported/disabled operation: i 
Image Created -> 04-Request-Headers_13.png 
Converted Images are saved at -> C:\Documents\Converted_PdfFiles_to_Image 
+1

このエラーが発生しました 2015年5月26日11:43:31 AM org.apache.pdfbox.util.PDFStreamEngine processOperator サポートされていない/使用不可能な操作:BDC 2015年5月26日11:43: 31 AM org.apache.pdfbox.util.PDFStreamEngine processOperator INFO:unsupported/disabリード操作:EMC 私はpdfbox 1.8.9 jarを使用しています –

+0

PDFboxの最新バージョンでは若干異なります。 PDFRenderedクラスを使用します。 –

+0

テキストと画像の両方のコンテンツを持つpdfに問題があります。私は、最終的な画像(入力pdfファイルの)が生成された後、テキストデータが省略され、画像部分(背景画像など)のみが表示されることを見ました。この点についての助けに感謝します。 – yeppe

4

PDFBoxのやり方は、ネイティブバインディングを避けるための良い方法です。 PDFBoxからPDFImageWriterを使用しようとしましたが、数行で同じことをしましたが、完全に機能しました。 PDFDocumentを抽出し、ライターを使用する必要があります。

PDFImageWriter.write(doc, "png", null, , Integer.MAX_VALUE, "picture"); 

すべてのページについて

PDFImageWriter.write(doc, "png", null, 0, 0, "picture"); 

参照: PDFImageWriter Javadoc

+1

同じ例外があります! : – grep

+0

は 'ImageIO'よりも' PDFImageWriter'より信頼性が高いですか? 'ImageIO'を使う方が簡単です...信頼できない場合を除きます – mmcrae

+0

私の経験上、これはPDFからイメージを書きません。私は自分のPDF上に画像を持っていますが、PNGには表示されません。 – mmcrae

3

おそらくあなたが破損したPDFファイルを変換しようとしています。 PDFファイルにJPXEncodedストリームが含まれているときも同じエラーが発生します。

+0

いくつかのPDFパーサーはこれを処理できるjbig2デコーダを持っています –

6

あなたは(増分更新で)いくつかのPDFファイルでのエラーを回避するためにNonSequentialParserを使用しようとすることができます:

PDDocumentドキュメント= PDDocument.loadNonSeq(新しいファイル( "/ document.pdfを"));

+0

ありがとう、このエラーが発生しました –

0
try {   
       PDDocument document = PDDocument.load(PdfInfo.getPDFWAY()); 
       if (document.isEncrypted()) { 
        document.decrypt(PdfInfo.getPASSWORD()); 
       } 
       if ("bilevel".equalsIgnoreCase(PdfInfo.getCOLOR())) { 
        PdfInfo.setIMAGETYPE(BufferedImage.TYPE_BYTE_BINARY); 
       } else if ("indexed".equalsIgnoreCase(PdfInfo.getCOLOR())) { 
        PdfInfo.setIMAGETYPE(BufferedImage.TYPE_BYTE_INDEXED); 
       } else if ("gray".equalsIgnoreCase(PdfInfo.getCOLOR())) { 
        PdfInfo.setIMAGETYPE(BufferedImage.TYPE_BYTE_GRAY); 
       } else if ("rgb".equalsIgnoreCase(PdfInfo.getCOLOR())) { 
        PdfInfo.setIMAGETYPE(BufferedImage.TYPE_INT_RGB); 
       } else if ("rgba".equalsIgnoreCase(PdfInfo.getCOLOR())) { 
        PdfInfo.setIMAGETYPE(BufferedImage.TYPE_INT_ARGB); 
       } else { 
        System.exit(2); 
       } 
       PDFImageWriter imageWriter = new PDFImageWriter(); 
       boolean success = imageWriter.writeImage(document, PdfInfo.getIMAGE_FORMAT(),PdfInfo.getPASSWORD(), 
         PdfInfo.getSTART_PAGE(),PdfInfo.getEND_PAGE(),PdfInfo.getOUTPUT_PREFIX(),PdfInfo.getIMAGETYPE(),PdfInfo.getRESOLUTION()); 
       if (!success) { 
        System.exit(1); 
       } 
       document.close(); 

     } catch (IOException | CryptographyException | InvalidPasswordException ex) { 
      Logger.getLogger(PdfToImae.class.getName()).log(Level.SEVERE, null, ex); 
     } 
public class PdfInfo { 
    private static String PDFWAY;  
    private static String OUTPUT_PREFIX; 
    private static String PASSWORD; 
    private static int START_PAGE=1; 
    private static int END_PAGE=Integer.MAX_VALUE; 
    private static String IMAGE_FORMAT="jpg"; 
    private static String COLOR="rgb"; 
    private static int RESOLUTION=256; 
    private static int IMAGETYPE=24; 
    private static String filename; 
    private static String filePath=""; 
} 
0

PDFbox内部でfontbox-1.7.1を使用しているので、あなたの問題を解決するpdfbox jar

+0

"INFO:サポートされていない/無効にされた操作" INFOは無害で、無視することができます。そして誰も1.7.1を使うべきではありません。現在のバージョンは2.0.8です。 –

関連する問題