Как видно из названия, я пытаюсь сгенерировать PDF-документ из HTML-документа, используя библиотеку iText5 в Java. Моя текущая проблема заключается в том, что мне также нужно добавить в этот документ номер каждой страницы (в формате X of Y) И оглавление.
Мне нужно составить оглавление из закладок сгенерированного PDF-файла. Это h1 моего исходного html-файла.
Это связано с некоторыми проблемами. Чтобы понять их правильно, позвольте мне объяснить вам мой процесс:
- Я генерирую свой файл PDF в памяти из моего HTML
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, baos);
document.open();
try{
XMLWorkerHelper.getInstance().parseXHtml(writer, document, new FileInputStream(html_filename));
}catch(Exception e) {e.printStackTrace();}
document.close();
- Я делаю второй проход моего pdf-документа в памяти, чтобы построить оглавление и добавить нижний колонтитул (номера страниц)
PdfReader reader = new PdfReader(baos.toByteArray());
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(pdf_filename));
ColumnText ct = new ColumnText(null);
Paragraph p;
// Table of contents
ct.addElement(new Paragraph("Table of Contents"));
List<HashMap<String, Object>> bookmarks = SimpleBookmark.getBookmark(reader);
Chunk dottedLine = new Chunk(new DottedLineSeparator());
PdfAction action;
PdfAnnotation link;
for(int i=0; i<bookmarks.size(); i++){
HashMap bm = bookmarks.get(i);
p = new Paragraph(bm.get("Title").toString());
p.add(dottedLine);
p.add(bm.get("Page").toString().split(" ")[0]);
ct.addElement(p);
// ct.go();
// action = PdfAction.gotoLocalPage("p"+bm.get("Page").toString().split(" ")[0],false);
// link = new PdfAnnotation(, 36, ct.getYLine(), 559, 770, action);
}
int i = 0;
while(true) {
stamper.insertPage(++i, reader.getPageSize(1));
ct.setCanvas(stamper.getUnderContent(i));
ct.setSimpleColumn(36, 36, 559, 806);
if(!ColumnText.hasMoreText(ct.go()))
break;
}
// Page numeration
// Loop over the pages and add a footer to each page
int n = reader.getNumberOfPages();
for (i = 1; i <= n; i++) {
getFooterTable(i, n).writeSelectedRows(0, -1, 36, 36, stamper.getUnderContent(i));
}
// Close the stamper
stamper.close();
reader.close();
Этот метод связан со следующими проблемами:
Когда создается ток, получается, что мой первый заголовок находится на странице 1, и это правильно. Так что добавьте что-то вроде «Заголовок 1 ........... 1». Но когда мой ток вставлен в начало моего документа, мой заголовок 1 теперь является страницей 2, а не 1 больше. При построении моего токена я мог бы добавить 1, но я не знаю, будет ли мой ток длиной 1 страница или 2 страницы и т. Д. Если мой ток длиной 2 страницы, тогда мой заголовок 1 будет страницей 3 ...
Мой ток - это простой текст, и он не предоставляет ссылки на мои заголовки в моем документе pdf ... Я попытался добавить некоторую pdfannotation, но тщетно ...
Я прочитал много тем о нумерации страниц (X of Y) и построении toc, но, к сожалению, ничего, что могло бы помочь мне построить оба вместе.
Я был бы очень признателен, если бы кто-нибудь дал мне несколько советов и советов для достижения того, что мне нужно.