【问题标题】:itextpdf different margin on specific pageitextpdf 特定页面上的不同边距
【发布时间】:2016-06-27 14:58:37
【问题描述】:

大家好!

我对文档有一些疑问:

  1. itextpdf 是否可以选择在特定页面上设置不同的边距?我试过用

document.setMargin

然后

document.newPage

但似乎每一页都有相同的边距。

  1. 有没有办法防止标题和元素重叠?

谢谢!

编辑

这里是添加文档内容的方法:

    @Override
    void addDocumentContent(Document doc, PdfWriter writer, AbstractDiplomaDataModel diplomaData) throws DiplomaPdfFileProducerException {
        try {
            doc.setMargins(DefaultPdfDocumentSettings.LEFT_MARGIN, DefaultPdfDocumentSettings.RIGHT_MARGIN, 0f, 0f);
            doc.newPage();          
            doc.add(new DiplomaPdfDataGenerator(diplomaData).generateFirstPagePdf());
            doc.setMargins(DefaultPdfDocumentSettings.LEFT_MARGIN, DefaultPdfDocumentSettings.RIGHT_MARGIN, DefaultPdfDocumentSettings.TOP_MARGIN,DefaultPdfDocumentSettings.BOTTOM_MARGIN);
            doc.newPage();          
            doc.add(new DiplomaPdfDataGenerator(diplomaData).generateOtherPagesPdf());
        } catch (Exception e) {
            throw new DiplomaPdfFileProducerException(e.getMessage());
        }
    }

结果如下:

【问题讨论】:

  • DiplomaPdfDataGenerator.generateFirstPagePdf()DiplomaPdfDataGenerator.generateOtherPagesPdf() 返回什么?以及如何生成标题?那些DefaultPdfDocumentSettings 常量的值是什么?除此之外,代码看起来像我的答案中的代码,它确实像预期的那样工作。因此,这些对象或机制有些特殊。
  • 成功了。 generateFirstPagePdf() 和 generateOtherPagesPdf() 返回段落/元素。我只是没有注意到差异,因为 DefaultPdfDocumentSettings.TOP_MARGIN 是 20。我将上边距更改为 60,我注意到了差异
  • 太棒了!我开始想知道这些方法可以返回什么来使结果忽略边距... ;)

标签: java pdf-generation itext


【解决方案1】:

我刚刚试过你描述的:

StringBuilder builder = new StringBuilder("test");
for (int i = 0; i < 100; i++)
    builder.append(" test");
String test = builder.toString();

try (   OutputStream pdfStream = new FileOutputStream(new File(RESULT_FOLDER, "ChangingMargins.pdf")))
{
    Document pdfDocument = new Document(PageSize.A4.rotate(), 0, 0, 0, 0);
    PdfWriter.getInstance(pdfDocument, pdfStream);
    pdfDocument.open();

    for (int m = 0; m < pdfDocument.getPageSize().getWidth() / 2; m += 100)
    {
        pdfDocument.setMargins(m, m, 100, 100);
        pdfDocument.newPage();
        pdfDocument.add(new Paragraph(test));
    }

    pdfDocument.close();
}

(ChangeMargins.java 方法testChangingMargins)

结果:

因此,考虑到您的第 1 项:是的,iText 可以在特定页面上具有不同的边距。

OP 在评论中想知道:

上下边距如何? :/

为此,我将上面的循环更改为:

    for (int m = 0; m < pdfDocument.getPageSize().getWidth() / 2 && m < pdfDocument.getPageSize().getHeight() / 2; m += 100)
    {
        pdfDocument.setMargins(m, m, m, m);
        pdfDocument.newPage();
        pdfDocument.add(new Paragraph(test));
    }

结果:

因此,不同的顶部和底部边距也起作用。


考虑到您的问题 2,是否有任何方法可以防止标题和元素重叠:通常它们不会重叠。

【讨论】:

  • 上下边距如何? ://
  • 参见。我的编辑,在明显变化之后,垂直边距也发生了变化。
  • 我编辑了我的帖子以添加一些代码行和添加内容后发生的屏幕截图
  • 我有一个类似的问题,但我只添加了一个跨越多个页面的段落,它必须在第 1 页上具有不同的上边距,也可以实现吗?
  • @Joschka 你可以尝试使用页面事件来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多