Input/Output Frage zu pdfbox und FileUtils

Wolfi5

Neues Mitglied
Liebes Forum,

Ich befasse mich gerade damit, mehrere PDFs aus unterschiedlichen Quellen zu einem PDF "outPdf.pdf" zusammenzufassen.
Ich verwende org.apache.pdfbox und org.apache.commons.io.FileUtils

Was ich schon habe

Vorarbeiten:
PDFMergerUtility mergerUtility = new PDFMergerUtility();
ByteArrayOutputStream byteArrayOutStream = new ByteArrayOutputStream();

Aufgabe 1. kopiere ein PDF von der Festplatte in outPdf.pdf. Funktioniert.
mergerUtility.addSource(new File("c:\\temp\\pdf1.pdf"));

Aufgabe 2: Erzeuge ein PDF in einem byteArray (z.B. mit jasper) und kopiere es in outPdf.pdf. Funktionert.
byte[] bytearray;
bytearray = pdfErzeuger.machEinPdf();
mergerUtility.addSource(new ByteArrayInputStream(bytearray));

Aufgabe 3: Hole ein PDF von einem Webserver und kopiere es in outPdf.pdf.
Funktioniert, aber gefällt mir so nicht.

URL pdfURL = new URL("http://www.nsa.gov/pdf/AngelasMails.pdf");
File tempFile = new File("c:\\temp\\pdfweb.pdf");
FileUtils.copyURLToFile(pdfURL, tempFile);
mergerUtility.addSource(tempFile);

outPdf.pdf Wirklichkeit werden lassen:
mergerUtility.setDestinationStream(byteArrayOutStream);
mergerUtility.mergeDocuments();
... und ab mit byteArrayOutStream als PDF auf die Festplatte oder als Antwort zum Browser.

Frage:

Was mir bei Aufgabe 3 nicht gefällt ist, dass ich den Umweg über die Festplatte gehe.
Was ich möchte wäre sowas:
FileUtils.copyURLToInputStream(pdfURL, new ByteArrayInputStream(bytearrayFromWeb));
mergerUtility.addSource(new ByteArrayInputStream(bytearrayFromWeb));
Problem: FileUtils.copyURLToInputStream wäre toll, gibt es aber nicht. Siehe :rtfm:

Gibt es einen möglichst kurzen, direkten Weg, eine Datei per URL zu holen und in einen ByteArray zu stecken?
 
Das ist ja witzig, ich bin gerade (fast) an der selben Aufgabe dran 🙂
Nur muss ich die zu mergende Datei aus einem Outputstream holen und dann dort wieder reinstecken, da hab ich noch zu kämpfen mit.
Warum versucht du nicht folgendes:
Laut der APIdocs von PDFBox kannst du einen Inputstream als Quelle definieren:
addSource(InputStream source)
Add a source to the list of documents to merge.
Du kannst als InputStream auch eine URL definieren, so ungefähr:
InputStream input = new URL("http://www.somewebsite.com/a.txt").openStream();
In Kombination stelle ich mir das so ungefähr vor:
Java:
//1
mergerUtility.addSource(new File("c:\\temp\\pdf1.pdf"));

//2
byte[] bytearray;
bytearray = pdfErzeuger.machEinPdf();
mergerUtility.addSource(new ByteArrayInputStream(bytearray));

//3
mergerUtility.addSource(new URL("http://www.nsa.gov/pdf/AngelasMails.pdf").openStream());

//4
mergerUtility.setDestinationStream(byteArrayOutStream);
mergerUtility.mergeDocuments();

Ich habe es nicht ausprobiert, das überlasse ich dir, ist auch nur ein Denkanstoß, ich hoffe es hilft weiter.
Was ich mich noch Frage: Ich denke mal du hast den 'byteArrayOutStream' irgendwo definiert, aber nicht mit hingeschrieben, oder?
Verrat mir ob es geklappt hat bei dir, viel Erfolg noch,

Jérôme
 
Zuletzt bearbeitet:
Ja, hat funktioniert! Ganz einfach, wenn mans weiß, manchmal sieht man den Wald vor lauter Bäumen nicht.

Zu deiner Frage: Der ByteArray-Outputstream ist über der ganzen Mergerei definiert, steht oben bei "Vorarbeiten":
PDFMergerUtility mergerUtility = new PDFMergerUtility();
ByteArrayOutputStream byteArrayOutStream = new ByteArrayOutputStream();

Was ich weg gelassen hatte, um den Code für die Frage einfach zu halten, ist die Prüfung ob das PDF per URL abholbar ist. Mit dem hier unten etwas erweitert auf mehrere Response-Codes kann man im Logsatz schreiben, ob das PDF nicht da ist, der Webserver gar nicht antwortet, etc.
Und besser reagieren als mit Gesamt-Try-Catch, z.B. ein Ersatz-PDF holen, Fehlerseiten-PDF rein, ...

Aufgabe 3 schaut also komplett so aus:
Java:
URL pdfURL = new URL("http://www.nsa.gov/pdf/AngelasMails.pdf");

// Prüfen, ob PDF vorhanden:
HttpURLConnection huc = (HttpURLConnection) pdfURL.openConnection(); 
huc.setRequestMethod("GET");
huc.connect();  

// Response-Code 200 heisst PDF ist vorhanden. Holen und ins PDF.
if (huc.getResponseCode() == 200) {
  InputStream inpStream = new URL(pdfURL).openStream();
  mergerUtility.addSource(inpStream);
} else {
	System.out.println("pdfUrl=" pdfURL " : http-returncode=" + huc.getResponseCode());
}
 

Neue Themen


Zurück
Oben