嵌入的 OLE PDF 对象比 DOCX 中的原始对象大

ms88-或

我遇到的问题是,当我创建一个带有 .pdf 类型的嵌入(ole)文件的 docx 文档时,/embeddings 文件夹中生成的二进制文件比原始文档大。

我插入了一个大小为 52076 字节的文档。如果我将 .docx 重命名为 zip 并打开它,oleObject1.bin 有 55296 字节

现在,当我想用​​ Apache POI 提取文件时,该文件在那里但已损坏。

有任何想法吗?(我首先想到它可能被压缩了?)

谢谢

ms88-或

好的,我发现了问题:

例如,对于 docx,文件前有一些数据块(RootEntry、ObjInfo、Contents 等)。使用十六进制编辑器,您会看到文件从后面的某个地方开始。我通过查看目录是哪种类型来修复我的提取器 - 对于 pdf,您必须查看 CONTENTS 目录条目:

private void writeBinaryPackagePart(PackagePart part, File targetfolder, String extension, String fileName) throws IOException {
        if (StringUtils.isEmpty(fileName)) {
            fileName = generateUniqueId(OleExtractorUtils.OfficeType.BINARY).concat(".").concat(extension);
        }
        InputStream inputStream = FileMagic.prepareToCheckMagic(part.getInputStream());
        try {
            if (FileMagic.valueOf(inputStream) == FileMagic.OLE2) {
                try (NPOIFSFileSystem npoifsFileSystem = new NPOIFSFileSystem(inputStream)) {
                    if (isOle10Native(npoifsFileSystem.getRoot())) {
                        byte[] dataBuffer = Ole10Native.createFromEmbeddedOleObject(npoifsFileSystem.getRoot()).getDataBuffer();
                        writeOle10NativeObject(dataBuffer, fileName, targetfolder);
                    }
                    else if (npoifsFileSystem.getRoot().getEntryNames().contains("CONTENTS"))
                        try (DocumentInputStream contents = npoifsFileSystem.createDocumentInputStream("CONTENTS")) {
                            writeOle10NativeObject(IOUtils.toByteArray(contents), fileName, targetfolder);
                        }
                }
            }
        }
        catch (Exception e) {
            LOGGER.warn("Cannot create Ole10Native from Object {}! Writing the following binary: {}", part.getPartName(), fileName);
            ServiceUtil.moveUploadedFileToExistingTempFolder(inputStream, fileName, targetfolder);
            inputStream.close();
        }
    }

private boolean isOle10Native(DirectoryNode directoryNode) {
    String ole10Native = Ole10Native.OLE10_NATIVE;
    Iterator<Entry> entries = directoryNode.getEntries();
    while(entries.hasNext()) {
        Entry entry = entries.next();
        if (entry.getName().contains(ole10Native)) {
            return true;
        }
    }
    return false;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从OLE对象数据导出.docx

来自分类Dev

基于单元格嵌入OLE对象

来自分类Dev

Excel OLE对象嵌入式路径位置

来自分类Dev

将PDF无损嵌入到.docx文件中

来自分类Dev

从pdf提取嵌入式对象

来自分类Dev

将Excel作为OLE对象嵌入MS Word中,显示错误

来自分类Dev

如何在PowerPoint中使用VBA打开嵌入式OLE对象

来自分类Dev

如何直接嵌入ole对象。无需在磁盘中保存任何文件

来自分类Dev

VBA通过mailto发送嵌入式OLE PDF:

来自分类Dev

使用对象/嵌入/ iframe渲染PDF无法正常工作

来自分类Dev

如何识别Ole对象接口?

来自分类Dev

如何隐藏OLE控件的对象?

来自分类Dev

OLE对象插入更改对象格式

来自分类Dev

Mongodb 组嵌入对象

来自分类Dev

使用ADO将原始文件数据插入Access表的BLOB(“ OLE对象”)字段中

来自分类Dev

将访问图像OLE对象转换为C#中的原始图像字节数组

来自分类Dev

DXL获取ole对象名称

来自分类Dev

从 C# 代码开放访问 Ole 对象

来自分类Dev

是否可以知道 OLE 对象的实际高度?

来自分类Dev

在Word文档[VBA]中显示表中的OLE对象

来自分类Dev

在docx中按顺序处理对象

来自分类Dev

在VB WinForm中从.mdb保存/打开OLE对象

来自分类Dev

在VB WinForm中从.mdb保存/打开OLE对象

来自分类Dev

在Chrome中嵌入PDF文件

来自分类Dev

嵌入HTML中的PDF页面

来自分类Dev

在Chrome中嵌入PDF文件

来自分类Dev

阅读嵌入在 PDF 中的文本?

来自分类Dev

pullAll,同时删除嵌入的对象

来自分类Dev

嵌入式对象的路径