Как создать PDF-файл с оглавлением и номерами страниц х из у из HTML - PullRequest
0 голосов
/ 07 июня 2019

Как видно из названия, я пытаюсь сгенерировать PDF-документ из HTML-документа, используя библиотеку iText5 в Java. Моя текущая проблема заключается в том, что мне также нужно добавить в этот документ номер каждой страницы (в формате X of Y) И оглавление.

Мне нужно составить оглавление из закладок сгенерированного PDF-файла. Это h1 моего исходного html-файла.

Это связано с некоторыми проблемами. Чтобы понять их правильно, позвольте мне объяснить вам мой процесс:

  1. Я генерирую свой файл 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();
  1. Я делаю второй проход моего 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». Но когда мой ток вставлен в начало моего документа, мой заголовок 1 теперь является страницей 2, а не 1 больше. При построении моего токена я мог бы добавить 1, но я не знаю, будет ли мой ток длиной 1 страница или 2 страницы и т. Д. Если мой ток длиной 2 страницы, тогда мой заголовок 1 будет страницей 3 ...

  2. Мой ток - это простой текст, и он не предоставляет ссылки на мои заголовки в моем документе pdf ... Я попытался добавить некоторую pdfannotation, но тщетно ...

Я прочитал много тем о нумерации страниц (X of Y) и построении toc, но, к сожалению, ничего, что могло бы помочь мне построить оба вместе.

Я был бы очень признателен, если бы кто-нибудь дал мне несколько советов и советов для достижения того, что мне нужно.

...