PDF в байтовый массив и наоборот

Мне нужно преобразовать PDF в байтовый массив и наоборот.

Может кто-нибудь мне помочь?

Вот как я конвертирую в байтовый массив

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

Если я использую следующий код для его преобразования в документ, создается PDF-файл. Но это говорит '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); } 

12 Solutions collect form web for “PDF в байтовый массив и наоборот”

Вам в основном нужен вспомогательный метод для чтения streamа в память. Это работает очень хорошо:

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

Не смешивайте текстовые и двоичные данные – это только приводит к слезам.

Java 7 представил Files.readAllBytes() , который может читать PDF в 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); 

РЕДАКТИРОВАТЬ:

Спасибо Farooque за указание: это будет работать для чтения любого файла, а не только PDF-файлов. Все файлы, в конечном счете, представляют собой просто кучу байтов и, как таковые, могут быть прочитаны в byte[] .

Проблема в том, что вы вызываете toString() в самом объекте InputStream . Это вернет представление String объекта InputStream не фактический документ PDF.

Вы хотите читать PDF только как байты, так как PDF – это двоичный формат. Затем вы сможете записать тот же массив byte и он будет действительным PDF, так как он не был изменен.

например, читать файл в виде байтов

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

Вы можете сделать это с помощью Apache Commons IO не беспокоясь о внутренних деталях.

Используйте org.apache.commons.io.FileUtils.readFileToByteArray(File file) которые возвращают данные типа byte[] .

Нажмите здесь для Javadoc

Не создаете ли вы файл pdf, но не на самом деле записываете массив байтов? Поэтому вы не можете открыть PDF-файл.

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

Это в дополнение к правильному чтению в массиве PDF в байтах.

Вызов toString() в InputStream не делает то, что вы думаете. Даже если это так, PDF содержит двоичные данные, поэтому вы не захотите сначала преобразовать его в строку.

То, что вам нужно сделать, это прочитать из streamа, записать результаты в ByteArrayOutputStream , а затем преобразовать ByteArrayOutputStream в фактический массив byte , вызвав 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(); 
 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(); } 

Это работает для меня:

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

Выводит ноль как длину. Почему это ?

Ни один из них не сработал для нас, возможно, потому, что наш inputstream был byte от вызова для restа, а не из локально размещенного pdf-файла. Что работало с помощью RestAssured чтобы читать PDF в качестве входного streamа, а затем с помощью Tika pdf reader для его анализа, а затем вызвать метод 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)); 

Чтобы преобразовать PDF в byteArray :

 public byte[] pdfToByte(String filePath)throws JRException { File file = new File(); 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; } 

Я также внедрил аналогичное поведение в своем приложении. Ниже приведена моя версия кода, и она функциональна.

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

PDF-файлы могут содержать двоичные данные, и, скорее всего, они становятся искалеченными, когда вы делаете ToString. Мне кажется, что вы этого хотите:

  FileInputStream inputStream = new FileInputStream(sourcePath); int numberBytes = inputStream .available(); byte bytearray[] = new byte[numberBytes]; inputStream .read(bytearray); 
  • C # поиск ближайшего значения в массиве
  • Как удалить элемент из массива в C #
  • Массив размера массива, который отклоняет указатели
  • Почему элементы массива отформатированы как нули, когда они умножаются на 1/2 или 1/3?
  • Многомерный массив vs
  • Любой более быстрый способ копирования массивов в C #?
  • Почему большой локальный массив разбивает мою программу, но глобальный - нет?
  • Как создать правильный JSONArray в Java с помощью JSONObject
  • Передача массивов в качестве параметров в bash
  • «Int size = 10;» дает постоянное выражение?
  • Parse JSON Array без ключа в Android
  • Interesting Posts

    Как получить вертикальную geom_vline к оси x даты classа?

    Удаление библиотек из боковой панели Explorer 8

    Получить индексы n наибольших элементов в матрице

    Is “for (;;)” быстрее чем “while (TRUE)”? Если нет, то почему люди используют его?

    Изменение цвета подсказки EditText при использовании TextInputLayout

    Не удается создать массив LinkedLists в Java …?

    Как интерпретировать журнал caffe с помощью debug_info?

    Разница между новыми и отменой

    Как включить одновременную авторизацию нескольких пользователей в удаленной системе?

    Лучшее исключение для неисчерпывающих шаблонов в случае

    Что значит связать сокет многоадресной рассылки (UDP)?

    Поток интеграции и интеграция в ClearCase

    Как программно заблокировать / разблокировать экран?

    Остановить Excel, распознающий тире

    Когда следует использовать метод GET или POST? В чем разница между ними?

    Давайте будем гением компьютера.