Исходная информация
Я использую PDFBox 2.0.27 и пытаюсь добавить водяные знаки в мой PDF-файл (может быть), содержащий несколько страниц разных форматов DIN и ориентаций (вертикальной и горизонтальной).
По этой причине я создал для каждой комбинации формата Din и ориентации PDF-файл, который я хочу использовать для водяных знаков соответствующих страниц моего исходного PDF-файла.
Подход
Отношение конкретной страницы и файла оверлея/водяного знака хранится в HashMap<Integer, String> overlayGuide = new HashMap<>();
Для добавления водяных знаков на каждую страницу я использую следующий код:
PDDocument originalPDF = PDDocument.load(new File("..Original_PDF.pdf")); // To adjust with actual path
HashMap<Integer, String> overlayGuide = new HashMap<>();
overlayGuide.put(1, "..A1_Horizontal_Watermark.pdf"); // To adjust with actual path
Overlay overlay = new Overlay();
overlay.setInputPDF(originalPDF);
overlay.setOverlayPosition(Overlay.Position.BACKGROUND);
originalPDF = overlay.overlay(overlayGuide);
originalPDF.save(new File("C:\\AxaviaPdfServiceAPI\\temp\\watermarked.pdf"));
overlay.close();
Исходный фрагмент кода
Этот код основан на предложенном коде из здесь.
Проблема
Водяной знак не работает. Вывод, сгенерированный приведенным выше кодом, является исходным PDF-файлом. Я не получаю никаких исключений, ошибок или других подсказок, которые мог бы предоставить.
Что мне не хватает? Метод overlay.setOutputFile("final.pdf");, опубликованный в связанном вопросе о стеке, недоступен в моей текущей версии PDFBox.
Размер и ориентация страницы исходного PDF-файла и PDF-файла с водяным знаком одинаковы (/должны быть) одинаковыми. Ручное добавление водяного знака через Adobe Acrobat DC работает.
Ожидаемый результат
Основываясь на ручном добавлении через Adobe Acrobat DC, я ожидал что-то вроде здесь
К сожалению, я не смог найти параметр в классе Overlay, чтобы установить непрозрачность для добавления водяного знака PDF.
Что я пробовал
См. фрагмент кода выше и поиск в Google, который привел к более или менее такому же фрагменту кода. Другие решения обрабатывали только простой текст в виде водяных знаков или изображений.
Примеры файлов
Примеры файлов для тестирования моего кода можно найти здесь
Граничные условия
Я хочу придерживаться шаблонных PDF-файлов для водяных знаков, так как я хочу добавить дополнительные значки/изображения. Предоставленный пример файла — это всего лишь краткий черновик.
Обновление 2022-11-06
Пожалуйста, поделитесь как входными, так и выходными PDF-файлами вашего теста. – мкл
Оригинальный PDF: здесь
Водяной знак PDF: здесь
Результат PDF: здесь
Любая помощь приветствуется. Заранее спасибо.
Спасибо за ваш ответ. Я обновил свой вопрос и связал запрошенные вами файлы
Хорошо, Original_PDF.pdf и файл с водяным знаком.pdf представляют собой один и тот же PDF-файл. По сути, это известная ошибка, PDFBOX-5523 , которая уже исправлена. Это исправление будет содержаться в версии 2.0.28.




Спасибо mkl за указание на то, что подход с HashMap<Integer, String> overlayGuide = new HashMap<>(); в настоящее время содержит ошибки.
Решение/Обходной путь
Я использовал метод overlay.overlayDocuments(overlayGuidePDDocuments); с overlayGuidePDDocuments = HashMap<Integer, PDDocument>, и водяные знаки теперь установлены правильно.
Примечания
Установка непрозрачности для PDF-файлов шаблона водяного знака невозможна (или я не понимаю, как это сделать). Поэтому PDF-файлы шаблонов водяных знаков готовятся с непрозрачностью.
Пожалуйста, поделитесь как входными, так и выходными PDF-файлами вашего теста.