使用iText平铺,并添加边距

时间:2015-09-24 19:33:01

标签: itext

我正在关注Tiling Hero示例(http://itextpdf.com/examples/iia.php?id=116),但我希望能够为每个页面添加边距。

1 个答案:

答案 0 :(得分:1)

请查看TileClipped示例。它基于TilingHero示例,但它有一个转折:

public void manipulatePdf(String src, String dest)
    throws IOException, DocumentException {
    float margin = 30;
    // Creating a reader
    PdfReader reader = new PdfReader(src);
    Rectangle rect = reader.getPageSizeWithRotation(1);
    Rectangle pagesize = new Rectangle(rect.getWidth() + margin * 2, rect.getHeight() + margin * 2);
    // step 1
    Document document = new Document(pagesize);
    // step 2
    PdfWriter writer
        = PdfWriter.getInstance(document, new FileOutputStream(dest));
    // step 3
    document.open();
    // step 4
    PdfContentByte content = writer.getDirectContent();
    PdfImportedPage page = writer.getImportedPage(reader, 1);
    // adding the same page 16 times with a different offset
    float x, y;
    for (int i = 0; i < 16; i++) {
        x = -rect.getWidth() * (i % 4) + margin;
        y = rect.getHeight() * (i / 4 - 3) + margin;
        content.rectangle(margin, margin, rect.getWidth(), rect.getHeight());
        content.clip();
        content.newPath();
        content.addTemplate(page, 4, 0, 0, 4, x, y);
        document.newPage();
    }
    // step 4
    document.close();
    reader.close();
}

您是否看到我们如何区分rectpagesize?我们将rect定义为原始网页的大小,并将pagesize定义为略大的大小(取决于margin的值)。

我们在定义偏移量xy时使用rect,但我们添加margin来稍微改变偏移量。我们更改偏移量是因为我们剪切了pagesize。通过定义剪切路径来完成剪切:

content.rectangle(margin, margin, rect.getWidth(), rect.getHeight());
content.clip();
content.newPath();

在这三行之后添加的所有内容都将被我们在rectangle()方法中定义的矩形剪裁。如果您还想添加其他内容,则可能需要添加额外的saveState() / restoreState()方法,尤其是在需要在剪切路径之外添加内容时。