1

我正在构建一个包含多个表格的 PDF。其中一些比平时宽,所以我必须旋转几页(将它们横向放置)才能舒适地看到整个表格。

问题是:当我将文档旋转为横向时,从该点生成的书签会延迟(或多或少)一页。它不完全是一页,有一个不平衡的,但我已经能够通过将这些书签移回一页来解决它。

在大写的时候,我试图在文档写的时候旋转它。然后我尝试在单独的文档中打开两篇文章(纵向和横向),将它们合并到一个带有书签的最终文档中。在这两种情况下,(坏的)结果是相同的。

这是我使用的代码:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ByteArrayOutputStream baosLandscape = new ByteArrayOutputStream();
ByteArrayOutputStream baosTotal = new ByteArrayOutputStream();

PdfCopyFields copier = new PdfCopyFields(baosTotal);
copier.setViewerPreferences(PdfWriter.PageModeUseOutlines);

Document document = new Document(PageSize.A4, 72, 48, 48, 24);
PdfWriter writer = PdfWriter.getInstance(document, baos);
writer.setViewerPreferences(PdfWriter.PageModeUseOutlines);
document.open();
// WRITE MY TABLES IN PORTRAIT
document.close();

Document documentLandscape = new Document(PageSize.A4.rotate(), 48, 65, 71, 48);
PdfWriter writerLandscape = PdfWriter.getInstance(documentLandscape, baosLandscape);
documentLandscape.open();
// WRITE MY TABLES IN LANDSCAPE
documentLandscape.close();

PdfReader reader = new PdfReader(baos.toByteArray());
List bookmarks = SimpleBookmark.getBookmark(reader);
copier.addDocument(reader);

PdfReader readerLandscape = new PdfReader(baosLandscape.toByteArray());
List bookmarksLandscape = SimpleBookmark.getBookmark(readerLandscape);
copier.addDocument(readerLandscape);

// HERE IT IS WHERE I CORRECT THE DELAY FOR THE LANDSCAPE BOOKMARKS
SimpleBookmark.shiftPageNumbers(bookmarksLandscape, reader.getNumberOfPages()-1, null);
bookmarks.addAll(bookmarksLandscape);

copier.setOutlines(bookmarks);
copier.close();

return baosTotal;

但是,正如我之前提到的,它并不完全是一页,最后书签并不像我想要的那样精确。

你们中有人遇到过这个问题吗?有什么解决办法吗?还是我做错了什么?

提前致谢!

PS:我忘了提到我是通过在其中创建章节和章节(每个章节生成一个书签)来生成书签,最后将章节添加到文档中:

  Paragraph titulo = new Paragraph("TITLE", myTitleFont);
  titulo.setSpacingAfter(20f);
  Chapter chapter = new Chapter(titulo, 5);
  chapter.setNumberDepth(0);
  Section section = null;

  for(int i = 0; i < MAX; i++){
    Paragraph tableName = new Paragraph("Table " + i, myFont);
    section = chapter.addSection(10f, tableName, i);
    section.setNumberDepth(0);

    // GENERATE eventsTable

    eventsTable.setSpacingBefore(10f);
    eventsTable.setSpacingAfter(20f);
    section.add(eventsTable);

    section.newPage();
    section.setComplete(true);
  }

  chapter.setComplete(true);
  document.add(chapter);
4

1 回答 1

1

@Gayolomao,不确定这是否有帮助,但我遇到了类似的问题。当我在横向页面(位于纵向页面之后)上设置书签时,它会在一页后显示。

以下是我为纵向页面设置书签的方法,这对于纵向页面非常有用(尽管当用于横向页面时,书签会显示在第二个横向页面的开头):

document.newPage();
sect = "Chapter 1 Title";
sectionBookmark=new PdfOutline(root, new PdfDestination(PdfDestination.FITH, writer.getVerticalPosition(true)), sect);
document.add(new Paragraph(LEAD, sect, styleChapterTitle));

以下是我如何修改它以在位于纵向页面之后的第一个横向页面顶部获取书签:

document.setPageSize(PageSize.A4.rotate());  // landscape
document.newPage();
sect="Chapter 2 Title";
sectionBookmark=new PdfOutline(root, new PdfDestination(PdfDestination.FITH,0),sect); // use 0 on landscape pages to trigger bookmark at top of page
document.add(new Paragraph(LEAD, sect, styleChapterTitle));
于 2014-01-28T22:51:05.267 回答