2017-02-16 4 views
0

Я пытаюсь взять объект PDDocument и передать его другому модулю как InputStream без сохранения документа в файловой системе.Документ PDFBox для InputStream

Теперь, я прочитал около PDStream и вид понимаемого цели этого. Таким образом, я пытался сделать что-то вроде этого:

PDStream stream = new PDStream(document); 

InputStream is = stream.createInputStream(); 

Но когда я пытаюсь загрузить входной поток в PDDocument, я получаю эту ошибку:

Exception in thread "main" java.io.IOException: Error: End-of-File, expected line 
    at org.apache.pdfbox.pdfparser.BaseParser.readLine(BaseParser.java:1111) 
    at org.apache.pdfbox.pdfparser.COSParser.parseHeader(COSParser.java:1885) 
    at org.apache.pdfbox.pdfparser.COSParser.parsePDFHeader(COSParser.java:1868) 
    at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:245) 
    at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1098) 
    at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:995) 
    at app.DGDCreator.main(DGDCreator.java:35) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:143) 

Позже я обнаружил, что файл результат 0kb в размере ...

+0

Почему бы не использовать 'java.io.Input/OutputStream' и' save (OutputStream out) 'и' load (InputStream in) '? – PeterMmm

+0

Потому что я не хочу сохранять документ. Я хочу передать его как поток данных в другой модуль. –

+0

Что вы хотите сделать с документом в другом модуле? Почему бы просто не передать объект документа? – teppic

ответ

3

Я не мог понять, почему вы хотите это сделать, но, следующий код будет сделать это:

public static void main(String[] args) throws IOException { 
    byte[] file = FileUtils.readFileToByteArray(new File(
      "C:\\temp\\a_file.pdf")); 

    PDDocument document = null; 

    InputStream is = null; 
    ByteArrayOutputStream out = null; 

    try { 
     document = PDDocument.load(file); 
     out = new ByteArrayOutputStream(); 

     document.save(out); 

     byte[] data = out.toByteArray(); 
     is = new ByteArrayInputStream(data); 

     FileUtils.writeByteArrayToFile(new File(
       "C:\\temp\\denemeTEST123.pdf"), IOUtils.toByteArray(is)); 
    } finally { 
     IOUtils.closeQuietly(out); 
     IOUtils.closeQuietly(is); 
     IOUtils.closeQuietly(document); 
    } 
} 
+0

@ david-lasry, пожалуйста, отметьте как ответ, разве это не то, что вы хотели сделать? – AhmetRasitBekar

2

Так что любой другой поиск может иметь хороший ответ на этот вопрос. Я столкнулся с той же ситуацией, когда мне не нужно было сохранять файл на какой-либо машине и просто обрабатывать сам поток. Я нашел ответ here и повторю его ниже.

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
pdDoc.save(out); 
pdDoc.close(); 
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); 
+0

Это по существу то же самое, что и ответ @ AhmetRasitBekar. – mkl

+1

Моей реализации не требуется физическое расположение файла для сохранения файла, чтобы получить его во входной поток. Он делает все в памяти. –

+0

Ваши 4 строки кода эффективно являются подмножеством его кода, они более или менее представляют ядро ​​его решения, а остальная часть его кода может быть там, чтобы проиллюстрировать использование. вы можете сказать, что вы выделили необходимый код, но это все. – mkl

Смежные вопросы