multipartfile from bytes arreglo array java arrays pdf

from - list byte[]> to pdf java



PDF a matriz de bytes y viceversa (12)

Necesito convertir pdf a matriz de bytes y viceversa.

¿Alguien puede ayudarme?

Así es como me estoy convirtiendo en matriz de bytes

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

Si uso el siguiente código para convertirlo a documento, se está creando el pdf. Pero está diciendo ''Bad Format. Not a pdf'' ''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); }


Para convertir pdf a 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; }


¿No estás creando el archivo pdf pero no estás escribiendo el conjunto de bytes? Por lo tanto, no puede abrir el PDF.

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

Esto es además de leer correctamente en el PDF a la matriz de bytes.


Básicamente, necesitas un método de ayuda para leer una secuencia en la memoria. Esto funciona bastante bien:

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

Entonces lo llamarías con:

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

No mezcle texto y datos binarios, solo genera lágrimas.


El problema es que está llamando a toString() en el objeto InputStream . Esto devolverá una representación de String del objeto InputStream no el documento PDF real.

Desea leer el PDF solo como bytes, ya que el PDF es un formato binario. Luego podrá escribir esa misma matriz de byte y será un PDF válido ya que no se ha modificado.

por ejemplo, para leer un archivo como bytes

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


Esto funciona para mí:

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

Pero la respuesta de Jon no funciona para mí si se usa de la siguiente manera:

try(InputStream pdfin = new FileInputStream("input.pdf");OutputStream pdfout = new FileOutputStream("output.pdf")){ int k = readFully(pdfin).length; System.out.println(k); }

Salidas de cero como longitud. Porqué es eso ?


Java 7 introdujo Files.readAllBytes() , que puede leer un PDF en un byte[] como ese:

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

EDITAR:

Gracias Farooque por señalar: esto funcionará para leer cualquier tipo de archivo, no solo archivos PDF. En última instancia, todos los archivos son solo un grupo de bytes y, como tales, se pueden leer en un byte[] .


Llamar a toString() en un InputStream no hace lo que crees que hace. Incluso si lo hiciera, un PDF contiene datos binarios, por lo que no le conviene convertirlo primero en una cadena.

Lo que debe hacer es leer de la transmisión, escribir los resultados en ByteArrayOutputStream , luego convertir ByteArrayOutputStream en una matriz de byte real llamando toByteArray() :

InputStream inputStream = new FileInputStream(sourcePath); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); int data; while( (data = inputStream.read()) >= 0 ) { outputStream.write(data); } inputStream.close(); return outputStream.toByteArray();


Los archivos PDF pueden contener datos binarios y es probable que se destrocen cuando lo hace ToString. Me parece que quieres esto:

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


Ninguno de estos funcionó para nosotros, posiblemente porque nuestro inputstream era byte de una llamada de reposo, y no de un archivo pdf alojado localmente. Lo que funcionó fue usar RestAssured para leer el PDF como un flujo de entrada, y luego usar el lector de Tika PDF para analizarlo y luego llamar al método 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));


Puedes hacerlo usando Apache Commons IO sin preocuparte por los detalles internos.

Use org.apache.commons.io.FileUtils.readFileToByteArray(File file) que devuelva datos de tipo byte[] .

Haga clic aquí para Javadoc


También implementé un comportamiento similar en mi aplicación sin falta. A continuación está mi versión de código y es funcional.

byte[] getFileInBytes(String filename) { File file = new File(filename); int length = (int)file.length(); byte[] bytes = new byte[length]; try { BufferedInputStream reader = new BufferedInputStream(new FileInputStream(file)); reader.read(bytes, 0, length); System.out.println(reader); // setFile(bytes); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return bytes; }


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