2017-02-16 1 views
0

J'essaie de prendre un objet PDDocument et de le passer à un autre module en tant que InputStream sans enregistrer le document dans le système de fichiers. Maintenant, j'ai lu environ PDStream et j'ai compris le but de cela. Par conséquent, j'ai essayé de faire quelque chose comme ceci:PDFBox document à InputStream

PDStream stream = new PDStream(document); 

InputStream is = stream.createInputStream(); 

Mais lorsque je tente de charger ce flux d'entrée dans un PDDocument, je reçois cette erreur:

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) 

Plus tard, je découvre que le fichier résultat est 0kb taille ...

+0

Pourquoi ne pas utiliser un 'java.io.Input/OutputStream' et' save (OutputStream out) 'et' charge (InputStream) '? – PeterMmm

+0

Parce que je ne veux pas enregistrer le document. Je veux le passer comme un flux de données à un autre module –

+0

Que voulez-vous faire avec le document dans l'autre module? Pourquoi ne pas simplement passer l'objet document? – teppic

Répondre

3

Je ne comprenais pas pourquoi vous voulez faire cela, mais, le code suivant fera:

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 veuillez marquer comme réponse, n'est-ce pas ce que vous vouliez faire? – AhmetRasitBekar

2

Alors quelqu'un d'autre peut chercher une bonne réponse à cela. J'ai couru dans la même situation où je ne voulais pas avoir à enregistrer le fichier sur une machine et juste gérer le flux lui-même. J'ai trouvé une réponse here et je vais le répéter ci-dessous.

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

Ceci est essentiellement la même chose que la réponse de @ AhmetRasitBekar. – mkl

+1

Mon implémentation ne nécessite pas d'emplacement de fichier physique pour enregistrer le fichier afin de l'inclure dans un flux d'entrée. Il fait tout en mémoire. –

+0

Vos 4 lignes de code sont effectivement un sous-ensemble de son code, elles représentent plus ou moins le noyau de sa solution, aussi, le reste de son code peut être là pour illustrer l'utilisation. vous pourriez dire que vous avez isolé le code essentiel, mais c'est à peu près tout. – mkl