我有一张Excel工作表,允许用户点击特定单元格并附加/嵌入文件。这些文件通常是.pdf和.jpg格式。我已经阅读了关于如何使用Apache POI读取嵌入文件的繁忙开发人员指南,但我不认为我实际上正在读取正确的文件,因为当我去本地保存文件或编码然后解码为了测试,文件说腐败,不会打开。
以下是一些代码:
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);
上面的代码将它转换为我的XML的base64。但是,当我在测试脚本中解码时,我无法打开文件,因为Adobe中的错误表明文件已损坏或未正确保存。
当我遍历getAllEmbedds()时,我得到oleObject1.bin,或oleObject2.bin,或者,oleObject3.bin等。我相信这是我的嵌入式文件的二进制版本,所以如何将它们转换回原始格式,以便可以在本地或其他机器上打开?
我的总体目标是将嵌入式对象作为Base64BinaryObjects放入XML中,将XML发送到另一个系统,以便将这些文件拉出来进行查看。我目前的问题是,一旦从XML检索文件,他们就不会打开,因为它们已损坏/损坏/格式不正确。
更新:深入研究oleObject.bin文件,我发现原始文件中添加了某种包装器。因此,在原始文件的前端和末尾添加了字节(?)。当我在Adobe中打开文件时,我发现该文件已损坏,因为它无法在前1024个字节内找到%PDF。所以,我想我的问题会导致 - 如何删除文件开头的包装器和/或字节?
答案 0 :(得分:3)
我能够为oleObject.bin文件解决这个问题。问题是* .bin文件正在向原始文件添加OLE标头,当我尝试通过Adobe读取文件时,出现错误。所以我不得不删除添加的标题或弄清楚如何获取没有标题的内容。这对我有用:
POIFSFileSystem fs = new POIFSFileSystem(pPart.getInputStream());
TikaInputStream stream = null;
stream = TikaInputStream.get(fs.createDocumentInputStream("CONTENTS"));
bytes = IOUtils.toByteArray(stream);
String encoded = Base64.encodeBase64String(bytes);