2009-07-15 14 views
23

मुझे पीडीएफ को बाइट सरणी और इसके विपरीत रूपांतरित करने की आवश्यकता है।बाइट सरणी के लिए पीडीएफ और इसके विपरीत

क्या कोई मेरी मदद कर सकता है?

इस तरह मैं बाइट सरणी

public static byte[] convertDocToByteArray(String sourcePath) { 

    byte[] byteArray=null; 
    try { 
     InputStream inputStream = new FileInputStream(sourcePath); 


     String inputStreamToString = inputStream.toString(); 
     byteArray = inputStreamToString.getBytes(); 

     inputStream.close(); 
    } catch (FileNotFoundException e) { 
     System.out.println("File Not found"+e); 
    } catch (IOException e) { 
       System.out.println("IO Ex"+e); 
    } 
    return byteArray; 
} 

में कनवर्ट कर रहा हूँ मैं दस्तावेज़ में इसे वापस कन्वर्ट करने के लिए कोड निम्न का उपयोग करते हैं, पीडीएफ बनाया जा रहा है। लेकिन यह कह रहा है 'Bad Format. Not a pdf'

public static void convertByteArrayToDoc(byte[] b) {   

    OutputStream out; 
    try {  
     out = new FileOutputStream("D:/ABC_XYZ/1.pdf"); 
     out.close(); 
     System.out.println("write success"); 
    }catch (Exception e) { 
     System.out.println(e); 
    } 

उत्तर

-2

पीडीएफ़ बाइनरी डेटा हो सकता है और संभावना है कि यह घायल हो रही है जब आप ToString कर रहे हैं। मुझे ऐसा लगता है कि आप इस चाहते हैं कि:

 FileInputStream inputStream = new FileInputStream(sourcePath); 

     int numberBytes = inputStream .available(); 
     byte bytearray[] = new byte[numberBytes]; 

     inputStream .read(bytearray); 
+0

डेटा पढ़ने का एक भयानक तरीका है कि - कृपया यह न मानें कि उपलब्ध() एक में डेटा के सभी शामिल होंगे धारा। –

+1

@ जोन - सेकेंड। उपलब्ध() (आमतौर पर) बाइट्स की संख्या वापस कर देगा जो बिना अवरुद्ध किए तुरंत पढ़ा जा सकता है। फ़ाइल में वास्तव में कितना डेटा वास्तव में है .. –

10

समस्या यह है कि आप InputStream वस्तु पर ही toString() बुला रहे हैं है। यह StringInputStream ऑब्जेक्ट का वास्तविक पीडीएफ दस्तावेज़ नहीं प्रस्तुत करेगा।

आप पीडीएफ को केवल बाइट्स के रूप में पढ़ना चाहते हैं क्योंकि पीडीएफ एक बाइनरी प्रारूप है। फिर आप उसी byte सरणी को लिखने में सक्षम होंगे और यह एक वैध पीडीएफ होगा क्योंकि इसे संशोधित नहीं किया गया है।

उदा। एक InputStream पर बाइट्स के रूप में

File file = new File(sourcePath); 
InputStream inputStream = new FileInputStream(file); 
byte[] bytes = new byte[file.length()]; 
inputStream.read(bytes); 
+1

यहां तक ​​कि यह इनपुटस्ट्रीम ऑब्जेक्ट को बाइट एरे – nisha

1

toString() कॉलिंग आप क्या सोचते हैं यह करता है नहीं करता है एक फ़ाइल को पढ़ने के लिए। यहां तक ​​कि अगर ऐसा होता है, तो पीडीएफ में बाइनरी डेटा होता है, इसलिए आप इसे पहले स्ट्रिंग में कनवर्ट नहीं करना चाहते हैं।

आप, क्या करने के लिए धारा से पढ़ा जाता है एक ByteArrayOutputStream में परिणाम लिखने की जरूरत है, तो toByteArray() को फोन करके एक वास्तविक byte सरणी में ByteArrayOutputStream कन्वर्ट:

InputStream inputStream = new FileInputStream(sourcePath); 
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 

int data; 
while((data = inputStream.read()) >= 0) { 
    outputStream.write(data); 
} 

inputStream.close(); 
return outputStream.toByteArray(); 
+0

में पीडीएफ नहीं करता है, एक समय में एक बाइट पढ़ना बहुत ही कुशल नहीं है। एक समय में एक ब्लॉक की प्रतिलिपि बनाने के लिए बेहतर है। –

+0

@ जोन - सच है, लेकिन मैं टीआई को सरल रखने की कोशिश कर रहा था। साथ ही, FileInputStream आंतरिक रूप से बफरिंग नहीं करता है जो कि इसे कम करेगा? –

27

आप मूल रूप से एक सहायक विधि की आवश्यकता को पढ़ने के लिए स्मृति में एक धारा। यह बहुत अच्छी तरह से काम करता है:

public static byte[] readFully(InputStream stream) throws IOException 
{ 
    byte[] buffer = new byte[8192]; 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

    int bytesRead; 
    while ((bytesRead = stream.read(buffer)) != -1) 
    { 
     baos.write(buffer, 0, bytesRead); 
    } 
    return baos.toByteArray(); 
} 

तो फिर तुम से कॉल करने चाहते हैं:

public static byte[] loadFile(String sourcePath) throws IOException 
{ 
    InputStream inputStream = null; 
    try 
    { 
     inputStream = new FileInputStream(sourcePath); 
     return readFully(inputStream); 
    } 
    finally 
    { 
     if (inputStream != null) 
     { 
      inputStream.close(); 
     } 
    } 
} 

पाठ और बाइनरी डेटा अप मिश्रण नहीं करें - यह केवल आँसू की ओर जाता है।

+1

मुझे लगता है कि कथन के दौरान पढ़ने में एक अतिरिक्त ब्रैकेट होने की आवश्यकता है .. जैसे जबकि ((बाइट्स रीड = स्ट्रीम.read (बफर))! = -1) – Skeptor

+0

@ स्केप्टर: हो गया, धन्यवाद। –

1

क्या आप पीडीएफ फ़ाइल नहीं बना रहे हैं लेकिन वास्तव में बाइट सरणी को वापस नहीं लिख रहे हैं? इसलिए आप पीडीएफ नहीं खोल सकते हैं।

out = new FileOutputStream("D:/ABC_XYZ/1.pdf"); 
out.Write(b, 0, b.Length); 
out.Position = 0; 
out.Close(); 

यह बाइट सरणी में पीडीएफ में सही ढंग से पढ़ने के अलावा है।

+0

out.position = 0 ?? मुझे यह पता चलता है कि –

+0

यह उपयोगी नहीं हो सकता है क्योंकि आप इसे फ़ाइल में सहेज रहे हैं लेकिन मैं उन मुद्दों में भाग गया जहां मैं बाइट सरणी को मेमोरीस्ट्रीम ऑब्जेक्ट में डाल रहा था और इसे क्लाइंट को डाउनलोड कर रहा था। काम करने के लिए मुझे स्थिति को 0 पर सेट करना पड़ा। – David

5

आप आंतरिक विवरणों के बारे में चिंता किए बिना Apache Commons IO का उपयोग कर ऐसा कर सकते हैं।

org.apache.commons.io.FileUtils.readFileToByteArray(File file) का उपयोग करें जो byte[] प्रकार का डेटा लौटाता है।

Click here for Javadoc

0

यह मेरे लिए काम करता है:

try(InputStream pdfin = new FileInputStream("input.pdf");OutputStream pdfout = new FileOutputStream("output.pdf")){ 
    byte[] buffer = new byte[1024]; 
    int bytesRead; 
    while((bytesRead = pdfin.read(buffer))!=-1){ 
     pdfout.write(buffer,0,bytesRead); 
    } 
} 

लेकिन अगर का प्रयोग इस प्रकार जॉन का जवाब मेरे लिए काम नहीं करता है:

try(InputStream pdfin = new FileInputStream("input.pdf");OutputStream pdfout = new FileOutputStream("output.pdf")){ 

    int k = readFully(pdfin).length; 
    System.out.println(k); 
} 

आउटपुट शून्य लम्बाई के रूप में। ऐसा क्यों है ?

0

इनमें से कोई भी हमारे लिए काम नहीं करता है, संभवतः क्योंकि हमारे inputstreambyte एस बाकी कॉल से थे, न कि स्थानीय रूप से होस्ट की गई पीडीएफ फ़ाइल से। पीडीएफ को इनपुट स्ट्रीम के रूप में पढ़ने के लिए RestAssured का उपयोग करके और फिर इसे पार्स करने के लिए Tika पीडीएफ रीडर का उपयोग करके और फिर toString() विधि को कॉल करने के लिए क्या काम किया गया था।

import com.jayway.restassured.RestAssured; 
import com.jayway.restassured.response.Response; 
import com.jayway.restassured.response.ResponseBody; 

import org.apache.tika.exception.TikaException; 
import org.apache.tika.metadata.Metadata; 
import org.apache.tika.parser.AutoDetectParser; 
import org.apache.tika.parser.ParseContext; 
import org.apache.tika.sax.BodyContentHandler; 
import org.apache.tika.parser.Parser; 
import org.xml.sax.ContentHandler; 
import org.xml.sax.SAXException; 

      InputStream stream = response.asInputStream(); 
      Parser parser = new AutoDetectParser(); // Should auto-detect! 
      ContentHandler handler = new BodyContentHandler(); 
      Metadata metadata = new Metadata(); 
      ParseContext context = new ParseContext(); 

      try { 
       parser.parse(stream, handler, metadata, context); 
      } finally { 
       stream.close(); 
      } 
      for (int i = 0; i < metadata.names().length; i++) { 
       String item = metadata.names()[i]; 
       System.out.println(item + " -- " + metadata.get(item)); 
      } 

      System.out.println("!!Printing pdf content: \n" +handler.toString()); 
      System.out.println("content type: " + metadata.get(Metadata.CONTENT_TYPE)); 
15

जावा 7 शुरू की Files.readAllBytes(), जो में एक पीडीएफ पढ़ सकते हैं एक byte[] तो जैसे:

import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.Files; 

Path pdfPath = Paths.get("/path/to/file.pdf"); 
byte[] pdf = Files.readAllBytes(pdfPath); 

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

धन्यवाद फारूख ओर इशारा करते हुए के लिए: यह किसी भी तरह का पढ़ने के लिए काम करेंगे फ़ाइल, सिर्फ पीडीएफ नहीं। सभी फाइलें अंततः बाइट्स का एक गुच्छा हैं, और इस तरह इसे byte[] में पढ़ा जा सकता है।

+0

आयात संपादन @Farooque के लिए धन्यवाद! आपका क्या मतलब है "आम तौर पर यह किसी भी दिए गए फ़ाइल को बाइट []" में पढ़ सकता है? –

+1

मैंने पीडीएफ, जेपीजी, जीआईएफ, पीएनजी, टीटीटी फाइलों का परीक्षण किया जो पूरी तरह से काम करता है। चूंकि यह सभी प्रकार की फाइलों का समर्थन करता है, अगर किसी को सभी प्रकार की ज़रूरत है तो "सामान्य रूप से यह किसी भी दिए गए फ़ाइल को बाइट में पढ़ सकता है []" सूचना उपयोगी होगी – Farooque

1
public static void main(String[] args) throws FileNotFoundException, IOException { 
     File file = new File("java.pdf"); 

     FileInputStream fis = new FileInputStream(file); 
     //System.out.println(file.exists() + "!!"); 
     //InputStream in = resource.openStream(); 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     byte[] buf = new byte[1024]; 
     try { 
      for (int readNum; (readNum = fis.read(buf)) != -1;) { 
       bos.write(buf, 0, readNum); //no doubt here is 0 
       //Writes len bytes from the specified byte array starting at offset off to this byte array output stream. 
       System.out.println("read " + readNum + " bytes,"); 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(genJpeg.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     byte[] bytes = bos.toByteArray(); 

     //below is the different part 
     File someFile = new File("java2.pdf"); 
     FileOutputStream fos = new FileOutputStream(someFile); 
     fos.write(bytes); 
     fos.flush(); 
     fos.close(); 
    } 
0

bytearray को पीडीएफ कन्वर्ट करने के लिए:

public byte[] pdfToByte(String filePath)throws JRException { 

     File file = new File(<filePath>); 
     FileInputStream fileInputStream; 
     byte[] data = null; 
     byte[] finalData = null; 
     ByteArrayOutputStream byteArrayOutputStream = null; 

     try { 
      fileInputStream = new FileInputStream(file); 
      data = new byte[(int)file.length()]; 
      finalData = new byte[(int)file.length()]; 
      byteArrayOutputStream = new ByteArrayOutputStream(); 

      fileInputStream.read(data); 
      byteArrayOutputStream.write(data); 
      finalData = byteArrayOutputStream.toByteArray(); 

      fileInputStream.close(); 

     } catch (FileNotFoundException e) { 
      LOGGER.info("File not found" + e); 
     } catch (IOException e) { 
      LOGGER.info("IO exception" + e); 
     } 

     return finalData; 

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