Мои два документа создаются с использованием HtmlConverter.convertToDocument и впоследствии объединяются в один PDF:
PdfDocument pdf = new PdfDocument(new PdfWriter(pdfDest));
PdfMerger merger = new PdfMerger(pdf, false, true).setCloseSourceDocuments(true);
// Convert
ConverterProperties converterProperties = new ConverterProperties().setBaseUri(resourceFolder);
OutlineHandler outlineHandler = OutlineHandler.createStandardHandler();
converterProperties.setBaseUri(".");
converterProperties.setOutlineHandler(outlineHandler);
Первый документ содержит закладки «HTML Ipsum Presents», а второй - «Plastic_parts_Basic» и «Amo» (с детьми).
Обратите внимание на использование обработчика контура.После слияния кажется, что закладки смешиваются.Это имеет смысл, учитывая, что OutlineHandler для каждого документа создает места назначения по одному и тому же шаблону:
OutlineHandler addOutline(ITagWorker tagWorker, IElementNode element, ProcessorContext context) {
String tagName = element.name();
if (null != tagWorker && hasTagPriorityMapping(tagName) && context.getPdfDocument() != null) {
int level = (int) getTagPriorityMapping(tagName);
if (null == currentOutline) {
currentOutline = context.getPdfDocument().getOutlines(false);
}
PdfOutline parent = currentOutline;
while (!levelsInProcess.isEmpty() && level <= levelsInProcess.getFirst()) {
parent = parent.getParent();
levelsInProcess.pop();
}
String content = ((JsoupElementNode) element).text();
if (content.isEmpty()) {
content = getUniqueID(tagName);
}
PdfOutline outline = parent.addOutline(content);
String destination = DESTINATION_PREFIX + getUniqueID(DESTINATION_PREFIX);
outline.addDestination(PdfDestination.makeDestination(new PdfString(destination)));
destinationsInProcess.push(destination);
levelsInProcess.push(level);
currentOutline = outline;
}
return this;
}
Нажатие на «Уровень заголовка 2» в закладках будет указывать на второй заголовок в последнем объединенном документе («Amo»)."):
Я пытался расширить класс OutlineHandler, но метод, который мне нужно изменить (getUniqueID), является закрытым и поэтому невидимым всуперкласс.
Есть ли способ получить уникальные места назначения для нескольких документов, созданных из HTML?
Исходные файлы (java и html) и полученные PDF-файлы (см. RFQMerge.pdf) находятся здесь: исходный код, файлы и результат
Принятый ответ у меня не сработал, я продолжал получать NullPointerException во второй строке этого кода:
PdfDictionary names = targetPdf.getCatalog().getPdfObject().getAsDictionary(PdfName.Names);
names.put(PdfName.Dests, replaceDict);
Вот код курса и файлы ввода / исходного кода: https://www.dropbox.com/s/kg7vsb0j3hbkfca/stackoverflowClarification.zip?dl=0