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

标签 java apache apache-poi

我有一个 Excel 工作表,允许用户单击特定的单元格并附加/嵌入文件。这些文件通常为 .pdf 和 .jpg 格式。我已经阅读了关于如何使用 Apache POI 读取嵌入式文件的 Busy Developers 指南,但是我不认为我实际上正在读取正确的文件,因为当我去本地保存文件或编码然后解码以进行测试时,文件说腐败,不会打开。

这是一些代码:

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。但是,当我在测试脚本中对此进行解码时,我无法打开文件,因为 Adob​​e 中的错误表明文件已损坏或未正确保存。

当我循环访问 getAllEmbedds() 时,我得到了 oleObject1.bin、oleObject2.bin 或 oleObject3.bin 等。我相信这是我的嵌入式文件的二进制版本,那么如何将它们转换回原始格式以便它们可以在本地或在另一台机器上打开?

我的总体目标是将嵌入式对象作为 Base64BinaryObjects 放入 XML 中,将 XML 发送到另一个系统,以便它可以提取这些文件以供审查。我当前的问题是,一旦从 XML 中检索到文件,它们将无法打开,因为它们已损坏/损坏/格式不正确。

更新:深入查看 oleObject.bin 文件,我发现原始文件中添加了某种包装器。所以在原始文件的前端和末尾添加了字节(?)。当我在 Adob​​e 中打开文件时,我发现文件已损坏,因为它在前 1024 个字节内找不到 %PDF。所以,我想我的问题会导致 - 如何删除包装器和/或文件开头的字节?

最佳答案

我能够为 oleObject.bin 文件解决这个问题。问题是 *.bin 文件正在向原始文件添加 OLE header ,当我尝试通过 Adob​​e 读取文件时,出现错误。所以我不得不删除添加的标题或弄清楚如何在没有标题的情况下获取内容。这是对我有用的:

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

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

关于java - 从 Excel 嵌入式对象到 XML 中的 Base64 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36165523/

相关文章:

linux - Samba、Apache 和 SVN。获得正确的权限

php隐藏所有错误

java - 使用 Apache Poi 从固定位置的模板复制表

java - 如何使用 apache POI 在 Excel 中使特定列只读

java - 当我们有访问器和修改器时,为什么要声明私有(private)字段?

java - 如何在 Android 中制作高级用户界面?

javascript - 从外部根文件夹访问js

java - Apache 兴趣点。在 Excel 中设置数据过滤器

java - 旅行推销员/车辆路线用例的最佳实现

java - 无法找到签名中引用的类 (Ljava/nio/file/Path;)