2013-02-22 20 views
8

पीडीएफबॉक्स का उपयोग करना, क्या एक पीडीएफ (या पीडीएफ बाइट []) को एक छवि बाइट [] में परिवर्तित करना संभव है? मैंने कई उदाहरण ऑनलाइन देखे हैं और केवल एक ही वर्णन कर सकता है कि फ़ाइल फ़ाइलों में कनवर्ट की गई फ़ाइल को सीधे लिखना या जावा एडब्ल्यूटी ऑब्जेक्ट में कनवर्ट करना।पीडीएफबॉक्स पीडीएफ को छवि बाइट में कनवर्ट करें []

मैं फाइल सिस्टम में एक छवि फ़ाइल लिखने के आईओ को नहीं लेना चाहता, एक बाइट [] में पढ़ा, और फिर इसे हटा दें।

तो यह मैं कर सकते हैं:

String destinationImageFormat = "jpg"; 
boolean success = false; 
InputStream is = getClass().getClassLoader().getResourceAsStream("example.pdf"); 
PDDocument pdf = PDDocument.load(is, true); 

int resolution = 256; 
String password = ""; 
String outputPrefix = "myImageFile"; 

PDFImageWriter imageWriter = new PDFImageWriter();  

success = imageWriter.writeImage(pdf, 
        destinationImageFormat, 
        password, 
        1, 
        2, 
        outputPrefix, 
        BufferedImage.TYPE_INT_RGB, 
        resolution); 

साथ ही इस रूप में:

InputStream is = getClass().getClassLoader().getResourceAsStream("example.pdf"); 

PDDocument pdf = PDDocument.load(is, true); 
List<PDPage> pages = pdf.getDocumentCatalog().getAllPages(); 

for (PDPage page : pages) 
{ 
    BufferedImage image = page.convertToImage(); 
} 

मैं कहां पर स्पष्ट नहीं कर रहा हूँ एक बाइट [] में BufferedImage tranform करने के लिए कैसे है। मुझे पता है कि यह imageWriter.writeImage() में फ़ाइल आउटपुट स्ट्रीम में परिवर्तित हो गया है, लेकिन मैं इस बात पर स्पष्ट नहीं हूं कि एपीआई कैसे काम करता है।

उत्तर

11

आप आउटपुटस्ट्रीम को लिखने के लिए ImageIO.write का उपयोग कर सकते हैं। बाइट [] प्राप्त करने के लिए, बाइटएरे ऑटपुटस्ट्रीम का उपयोग करें, फिर उस पर बाइटएरे() पर कॉल करें।

+1

धन्यवाद। यह इरादे के रूप में काम करता है। अगर मेरे पास पर्याप्त प्रतिष्ठा थी, तो मैं आपको वोट दूंगा, लेकिन यह स्टैक ओवरफ्लो में मेरी पहली पोस्ट है। – user2100746

+0

आपका स्वागत है; आप इसे स्वीकार्य के रूप में चिह्नित करने में सक्षम होना चाहिए। – aditsu

+0

@ user2100746 आपको उत्तर को स्वीकार किए जाने के रूप में चिह्नित करना चाहिए :) – Genjuro

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

Maven निर्भरता जोड़ें:

<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --> 
    <dependency> 
     <groupId>org.apache.pdfbox</groupId> 
     <artifactId>pdfbox</artifactId> 
     <version>2.0.1</version> 
    </dependency> 

और, बातचीत छवि के लिए एक पीडीएफ:

import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.rendering.PDFRenderer; 
import javax.imageio.ImageIO; 

private List<String> savePDF(String filePath) throws IOException { 
    List<String> result = Lists.newArrayList(); 

    File file = new File(filePath); 

    PDDocument doc = PDDocument.load(file); 
    PDFRenderer renderer = new PDFRenderer(doc); 

    int pageSize = doc.getNumberOfPages(); 
    for (int i = 0; i < pageSize; i++) { 
     String pngFileName = file.getPath() + "." + (i + 1) + ".png"; 

     FileOutputStream out = new FileOutputStream(pngFileName); 
     ImageIO.write(renderer.renderImageWithDPI(i, 96), "png", out); 
     out.close(); 

     result.add(pngFileName); 
    } 
    doc.close(); 
    return result; 
} 

संपादित करें:

import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.rendering.PDFRenderer; 
import javax.imageio.ImageIO; 

private List<String> savePDF(String filePath) throws IOException { 
    List<String> result = Lists.newArrayList(); 

    File file = new File(filePath); 

    PDDocument doc = PDDocument.load(file); 
    PDFRenderer renderer = new PDFRenderer(doc); 

    int pageSize = doc.getNumberOfPages(); 
    for (int i = 0; i < pageSize; i++) { 
     String pngFileName = file.getPath() + "." + (i + 1) + ".png"; 

     ByteArrayOutputStream out = new ByteArrayOutputStream(pngFileName); 
     ImageIO.write(renderer.renderImageWithDPI(i, 96), "png", out); 

     out.toByteArray(); // here you can get a byte array 

     out.close(); 

     result.add(pngFileName); 
    } 
    doc.close(); 
    return result; 
} 
+0

ओपी ने पीडीएफबॉक्स को सीधे एक 'बाइट []' पर एक पीडीएफ प्रस्तुत करने का तरीका बताया, फाइल नहीं। दूसरी ओर आपका जवाब केवल फ़ाइल में प्रस्तुत करने का एक और तरीका दिखाता है। – mkl

+0

फ़ाइलऑटपुटस्ट्रीम को ByteArrayOutputStream – BeeNoisy

+0

'' बाइटएर्रेऑटपुटस्ट्रीम आउट = नया बाइटएरे ऑटपुटस्ट्रीम (पीएनजीफ़ाइलनाम) "' - 'बाइटएरे ऑटपुटस्ट्रीम' में केवल दो कन्स्ट्रक्टर हैं, एक पैरामीटर के बिना और एक 'int' पैरामीटर के साथ। इस प्रकार, 'स्ट्रिंग' पैरामीटर का उपयोग करके आपका कॉल तब तक संकलित नहीं होगा जब तक कि आप 'java.io' में से एक की तुलना में एक अलग' ByteArrayOutputStream' का अर्थ न लें। – mkl

संबंधित मुद्दे