2013-08-12 47 views
15

Tôi muốn chuyển đổi tài liệu PDF thành hình ảnh. Tôi đã sử dụng Ghost4j.Chuyển đổi tệp PDF sang hình ảnh

Vấn đề: Ghost4J cần tập gsdll32.dll khi chạy, và tôi làm không muốn sử dụng các tập tin dll.

Câu hỏi 1: có cách nào không, trong ghost4j để chuyển đổi hình ảnh mà không có dll?

Câu hỏi 2: Tôi đã tìm thấy giải pháp trong API của PDFBox. org.apache.pdfbox.pdmodel.PDPagep have method convertToImage() `chuyển đổi trang PDF sang định dạng Hình ảnh.

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

Tôi chỉ có văn bản trên tài liệu PDF. và tôi có Ngoại lệ khi tôi chạy mã này:

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 

Trả lời

25

Bạn có thể dễ dàng chuyển đổi 04-Request-Headers.pdf trang tệp thành định dạng hình ảnh.

Chuyển đổi tất cả các trang pdf sang định dạng hình ảnh trong Java bằng Hộp PDF.

Jar cần pdfbox-1.8.3.jar

hoặc phụ thuộc maven

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

Dưới đây là giải pháp:

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

chuyển đổi có thể xảy ra của hình ảnh sang định dạng jpg, jpeg, png, bmp, gif.

Lưu ý: Tôi đã đề cập đến các định dạng hình ảnh được sử dụng chủ yếu.

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

điều khiển Output:

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

tôi nhận được lỗi này May 26, 2015 11:43:31 AM org.apache.pdfbox.util.PDFStreamEngine processOperator THÔNG TIN: hoạt động không được hỗ trợ/vô hiệu hóa: BDC May 26, 2015 11:43: 31 AM org.apache.pdfbox.util.PDFStreamEngine processOperator THÔNG TIN: không được hỗ trợ/hủy hoạt động dẫn đầu: EMC Tôi đang sử dụng pdfbox 1.8.9 jar –

+0

Nó hơi khác với phiên bản mới nhất của PDFbox. Sử dụng lớp PDFRendered. –

+0

pdf có cả nội dung văn bản và hình ảnh đều có vấn đề. Tôi đã thấy rằng sau khi hình ảnh cuối cùng (của tập tin pdf đầu vào) được tạo ra các dữ liệu văn bản được bỏ qua, chỉ một phần hình ảnh (như hình nền vv) được hiển thị. Bất kỳ sự giúp đỡ nào trong lĩnh vực này đều được đánh giá cao. – yeppe

4

Cách vượt qua PDFBox là cách hay để tránh ràng buộc gốc. Hãy thử sử dụng PDFImageWriter từ PDFBox, tôi đã làm tương tự với nó trong một vài dòng và nó hoạt động hoàn hảo. Bạn phải trích xuất PDFDocument và sử dụng tác giả với nó.

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

Đối với tất cả các trang.

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

Xem: PDFImageWriter Javadoc

+1

nó có cùng ngoại lệ! :( – grep

+0

là 'PDFImageWriter' đáng tin cậy hơn 'ImageIO'? Tôi thích sử dụng' ImageIO' vì nó đơn giản hơn ... trừ khi nó không đáng tin cậy – mmcrae

+0

Từ kinh nghiệm của tôi, điều này KHÔNG viết bất kỳ hình ảnh nào từ PDF, bạn có thể Ie Tôi có một hình ảnh trên PDF của tôi, và nó không hiển thị trong PNG – mmcrae

3

Có lẽ bạn có cố gắng để chuyển đổi tập tin PDF bị hỏng. Tôi có cùng lỗi khi tệp PDF chứa các luồng JPXEncoded.

+0

Một số trình phân tích cú pháp PDF hiện có bộ giải mã jbig2 sẽ có thể xử lý này –

6

Bạn có thể cố gắng sử dụng NonSequentialParser để tránh các lỗi với một số tập tin PDF (với bản cập nhật gia tăng):

PDDocument doc = PDDocument.loadNonSeq (File mới ("/ document.pdf"));

+0

Cảm ơn rất nhiều, nó đã được hữu ích cho tôi –

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

Đối với các lỗi:

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

Bạn cần phải bao gồm fontbox-1.7.1 jar trong đường dẫn lớp ngoài Apache lọ pdfbox sẽ khắc phục sự cố của bạn khi PDFBox sử dụng nội bộ hộp thư-1.7.1

+0

Thông tin "INFO: không được hỗ trợ/vô hiệu hóa" INFO vô hại và có thể bị bỏ qua. Và không ai nên sử dụng 1.7.1. Phiên bản hiện tại là 2.0.8. –

Các vấn đề liên quan