Встроенный OLE PDF-объект больше оригинала в DOCX - PullRequest
0 голосов
/ 24 августа 2018

У меня проблема в том, что когда я создаю документ docx со встроенным (ole) файлом типа .pdf, сгенерированный двоичный файл в папке / embeddings больше исходного документа.

Я вставил документ размером 52076 байт.Если я переименую .docx в zip и открою его, то oleObject1.bin будет иметь 55296 байт

Теперь, когда я хочу извлечь файл с помощью Apache POI, файл находится там, но поврежден.

Любые идеи?(Сначала я подумал, что это может быть сжато?)

Thx

1 Ответ

0 голосов
/ 27 августа 2018

Хорошо, я нашел проблему:

для docx, например, перед файлом есть несколько блоков данных (RootEntry, ObjInfo, Contents, ..). С помощью hex-редактора вы увидите, что файл начинается где-то позади. Я исправил свой экстрактор, посмотрев, какой тип каталога - для 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;
}
...