旋转pdf页面时书签不平衡

时间:2013-04-05 10:36:07

标签: java pdf itext

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

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

在大角度我尝试在文档被写入时旋转文档。然后我尝试在分开的文档中打开两个着作(纵向和横向),将它们与书签合并为一个最终文档。 (差)结果在两种情况下都是相同的。

以下是我使用的代码:

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;

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

你们之前有没有遇到过这个问题?任何解决方案?或者我做错了什么?

提前致谢!

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

  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);

1 个答案:

答案 0 :(得分: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));