Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Excel嵌入对象到XML中的Base64字符串_Java_Apache_Apache Poi - Fatal编程技术网

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

Java 从Excel嵌入对象到XML中的Base64字符串,java,apache,apache-poi,Java,Apache,Apache Poi,我有一个Excel表格,允许用户单击特定单元格并附加/嵌入文件。这些文件通常是.pdf和.jpg格式。我已经阅读了关于如何使用ApachePOI读取嵌入式文件的Busy Developers指南,但是我认为我实际上并没有读取正确的文件,因为当我在本地保存文件或进行编码然后解码以进行测试时,该文件显示已损坏且不会打开 下面是一些代码: for (PackagePart pPart : workbook.getAllEmbedds()) { InputStream inputStream =

我有一个Excel表格,允许用户单击特定单元格并附加/嵌入文件。这些文件通常是.pdf和.jpg格式。我已经阅读了关于如何使用ApachePOI读取嵌入式文件的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);
(PackagePart pPart:workbook.getAllEmbedds()的
{
InputStream InputStream=pPart.getInputStream();
byte[]bytes=IOUtils.toByteArray(inputStream);
inputStream.close();
byte[]encoded=Base64.encodeBase64(字节);
attachmentFile.setValue(编码);
JAXBElement item=ncObjectFactory.createBinaryBase64对象(attachmentFile);
附件.getBinaryObject().add(项);
附件.getBinaryFormatID().add(idType);
attachment.getBinaryScriptionText().add(attachmentTextType);
attachmentsType.getAttachment().add(附件);
上面的代码将其输入到我的XML的base64中。但是,当我在测试脚本中对其进行解码时,我无法打开这些文件,因为Adobe中的错误表明该文件已损坏或未正确保存

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

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


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

我能够为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);

尝试在
-z
模式下使用Apache Tika CLI应用程序提取所有嵌入的资源-这是否为您提供了有效的文件?感谢您的支持。我将尝试Tika CLI应用程序,但是我需要一个java解决方案来实现我的总体目标(将对象嵌入base64字符串)。提取只是一个测试用例,以查看pPart.getInputStream()是否实际上我得到了我所需要的。也许我的编码方式有问题。我的测试只是验证我至少可以将这些嵌入的文件提取到本地副本中。Apache Tika在下面使用Apache POI,所以它都是java。Tika应用只是将嵌入的文件导出到本地文件系统的最简单的方法r测试!Apache Tika CLI应用程序运行正常,但它提供了我已经知道的信息(oleObject1.bin、oleObject2.bin、oldObject3.bin等)。我的问题是我不知道如何将这些文件返回到原始格式(.pdf、.jpg、.png)。当我尝试时,它会说文件已损坏或未正确保存。我确切知道这些文件名和MIME类型,但我无法将它们正确转换回Tika CLI提取出来后,在提取的文件上运行带有
--detect
模式的Tika CLI会检测到什么?示例代码中的内容是什么,是否将*.bin对象提取到文件中?