2016-03-22 5 views
0

Ich habe ein Excel-Blatt, mit dem Benutzer auf bestimmte Zellen klicken und Dateien anfügen/einbetten können. Diese Dateien sind in der Regel PDF- und JPG-Format. Ich habe den Leitfaden für beschäftigte Entwickler gelesen, wie man eingebettete Dateien mit Apache POI liest, aber ich glaube nicht, dass ich tatsächlich die richtige Datei lese, denn wenn ich lokal Datei speichere oder kodiere, dann dekodiere ich zum Testen, heißt es in der Datei beschädigt und wird nicht geöffnet. HierVon Excel eingebetteten Objekt zu Base64 String in XML

ist ein Code:

for (PackagePart pPart : workbook.getAllEmbedds()) { 
    InputStream inputStream = pPart.getInputStream(); 
    byte[] bytes = IOUtils.toByteArray(inputStream); 
    inputStream.close(); 

    byte[] encoded = Base64.encodeBase64(bytes); 

    attachmentFile.setValue(encoded); 

    JAXBElement<Base64Binary> item = ncObjectFactory.createBinaryBase64Object(attachmentFile); 

    attachment.getBinaryObject().add(item); 
    attachment.getBinaryFormatID().add(idType); 
    attachment.getBinaryDescriptionText().add(attachmentTextType); 
    attachmentsType.getAttachment().add(attachment); 

Der obige Code wird es in base64 für meine XML. Wenn ich dies jedoch in einem Testskript entziffere, kann ich die Dateien nicht öffnen, da der Fehler in Adobe besagt, dass die Datei beschädigt oder nicht korrekt gespeichert ist.

Ich bekomme oleObject1.bin, oder oleObject2.bin, oder, oleObject3.bin, etc, während ich getAllEmbedds() durchlaufen. Ich glaube, das ist die binäre Version meiner eingebetteten Dateien, also wie wandle ich sie in ihr ursprüngliches Format zurück, damit sie lokal oder auf einem anderen Rechner geöffnet werden können?

Mein übergeordnetes Ziel ist es, eingebettete Objekte als Base64BinaryObjects in ein XML zu platzieren, XML an ein anderes System zu senden, damit diese Dateien zur Überprüfung abgerufen werden können. Mein aktuelles Problem ist, dass, sobald die Dateien aus dem XML abgerufen werden, sie nicht geöffnet werden, weil sie beschädigt/nicht korrekt formatiert sind.

Update: Wenn ich tiefer in die oleObject.bin-Dateien schaue, sehe ich, dass eine Art Wrapper zur Originaldatei hinzugefügt wird. Es werden also Bytes (?) Am Anfang und am Ende der Originaldatei hinzugefügt. Wenn ich die Datei in Adobe öffne, bekomme ich, dass die Datei beschädigt ist, da% PDF innerhalb der ersten 1024 Bytes nicht gefunden werden kann. Also, ich denke, meine Frage führt zu - wie entferne ich den Wrapper und/oder die Bytes am Anfang der Datei?

+1

Versuchen Sie, die Apache Tika CLI App im '-Z'-Modus zu verwenden, um alle eingebetteten Ressourcen zu extrahieren - gibt Ihnen das gültige Dateien? – Gagravarr

+0

Vielen Dank für die Unterstützung. Ich werde die Tika CLI App ausprobieren, aber ich brauche eine Java-Lösung für mein Gesamtziel (eingebettete Objekte in base64 String). Extrahieren war nur ein Testfall, um zu sehen, ob pPart.getInputStream() mir tatsächlich das gebracht hat, was ich brauchte. Vielleicht stimmt etwas nicht damit, wie ich kodiere. Mein Test war nur um zu bestätigen, dass ich diese eingebetteten Dateien zumindest in lokale Kopien extrahieren konnte. – mhugh220

+0

Apache Tika verwendet Apache POI darunter, also ist es alles Java. Die Tika App ist einfach der mit Abstand einfachste Weg, die eingebetteten Dateien zum Testen in das lokale Dateisystem zu bekommen! – Gagravarr

Antwort

1

Ich konnte dies für OleObject.bin-Dateien herausfinden. Das Problem ist, dass die * .bin-Datei einen OLE-Header zur ursprünglichen Datei hinzufügte und als ich versuchte, die Datei über Adobe zu lesen, habe ich einen Fehler erhalten. Also musste ich entweder den hinzugefügten Header entfernen oder herausfinden, wie man Inhalte ohne den Header bekommt. Hier ist, was für mich funktionierte:

POIFSFileSystem fs = new POIFSFileSystem(pPart.getInputStream()); 
TikaInputStream stream = null; 
stream = TikaInputStream.get(fs.createDocumentInputStream("CONTENTS")); 

bytes = IOUtils.toByteArray(stream); 
String encoded = Base64.encodeBase64String(bytes);