Объединение двух PDF-документов с помощью PDFMergerUtility: IOException («Дерево страниц root должно быть словарем») - PullRequest
0 голосов
/ 20 марта 2020

У меня есть приложение весенней загрузки, и я пытаюсь объединить два файла PDF. Тот, который я получаю в виде байтового массива из другого сервиса, и тот, который у меня есть локально в моем файле ресурсов: /static/documents/my-file.pdf. Это код того, как я получаю байтовый массив из моего файла из ресурсов:

public static byte[] getMyPdfContentForLocale(final Locale locale) {
    byte[] result = new byte[0];
    try {
        final File myFile = new ClassPathResource(TEMPLATES.get(locale)).getFile();
        final Path filePath = Paths.get(myFile.getPath());
        result = Files.readAllBytes(filePath);
    } catch (IOException e) {
        LOGGER.error(format("Failed to get document for local %s", locale), e);
    }
    return result;
}

Я получаю файл и получаю байтовый массив. Позже я пытаюсь объединить эти два файла со следующим кодом:

PDFMergerUtility pdfMergerUtility = new PDFMergerUtility();
pdfMergerUtility.addSource(new ByteArrayInputStream(offerDocument));
pdfMergerUtility.addSource(new ByteArrayInputStream(merkblattDocument));
ByteArrayOutputStream os = new ByteArrayOutputStream();
pdfMergerUtility.setDestinationStream(os);
pdfMergerUtility.mergeDocuments(null);
os.toByteArray();

Но, к сожалению, он выдает ошибку:

throw new IOException("Page tree root must be a dictionary");

Я проверил, и это делает эту проверку, прежде чем он выбрасывает это:

if (!(root.getDictionaryObject(COSName.PAGES) instanceof COSDictionary))
    {
        throw new IOException("Page tree root must be a dictionary");
    }

И я действительно понятия не имею, что это значит и как это исправить. Самое странное, что я создал совершенно новый проект и попробовал один и тот же код для объединения двух документов (одинаковых документов), и это работает!

Кроме того, я попробовал:

  1. Измените загрузочную версию пружины, если она в порядке
  2. Установите метод mergeDocuments следующим образом: pdfMergerUtility.mergeDocuments (setupMainMemoryOnly ())
  3. Установите метод mergeDocuments следующим образом: pdfMergerUtility.mergeDocuments (setupTempFileOnly ( ))
  4. Получить байты другим способом, не используя файлы из java .nio:
  5. И также выполнив это в другом потоке
  6. Объединение файлов только локально сохранено (в ресурсах)
  7. Слияние файла, который я получаю от другого сервиса - это работает, кстати, и поэтому я уверен, что он в порядке

Может кто-нибудь помочь с этим?

1 Ответ

0 голосов
/ 20 марта 2020

Проблема, как сказал Тильман Хаушерр , заключается в фильтрации ресурсов, которую вы можете найти в вашем файле pom. Если у вас есть случай, когда вам не разрешено изменять это, то этот подход поможет вам:

final String path = new 
ClassPathResource(TEMPLATES.get(locale)).getFile().getAbsolutePath();
final File file = new File(path);
final Path filePath = Paths.get(file.getPath());
result = Files.readAllBytes(filePath);

, а затем просто передайте байты объекту pdfMergerUtility (или даже всему файлу вместо списка байт).

...