从Excel嵌入对象到XML中的Base64字符串

时间:2016-03-22 21:24:25

标签: java apache apache-poi

我有一张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。所以,我想我的问题会导致 - 如何删除文件开头的包装器和/或字节?

1 个答案:

答案 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);