如何在超出给定矩形区域时将内容写入新页面(itext7)
How to write content to a new page when it exceeds the given rectangle area (itext7)
如何获取当前页码?
用例:使用itext5编写的应用需要使用itext7重写。
我们的应用程序为我们客户的每月账单生成 PDF 文件。
pdf 的结构:
创建文档:
PdfWriter writer = new PdfWriter(new FileOutputStream(filename));
PdfDocument pdfDocument = new PdfDocument(writer);
Document document = new Document(pdfDocument, PageSize.A4);
document.setMargins(82, 35, 0, 38);
buildBody(pdfData, document, writer);
pdfDocument.addEventHandler(PdfDocumentEvent.START_PAGE, new PdfStartPageHandler<>(pdfData, document, this));
pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new PdfEndPageHandler(document));
buildBodyContent(pdfData, document, writer);
document.close();
2.Each IEventHandler 实例具有此格式(矩形值除外):
public void handleEvent(Event event) {
document.add(lineSeparatorHeader);
document.add(paragraphInfo); //
document.add(lineSeparatorHeader);
}
paragraphInfo - 是一个 Paragraph(),它由一个 table 和两列组成
lineSeparatorHeader - 是一个 LineSeparator()
- buildBody(pdfData, document, writer) 必须填写我的 pdf 页面的 body。
我的问题是我不知道如何处理内容超出矩形大小的情况。我希望它创建一个新页面,生成一个具有相同尺寸的新矩形并继续在那里书写。
一个。是需要在每个页面上的 header
B. 是 body 其内容可能会占据一个以上的页面。如果它占用超过一页,新页面还必须包含 header 和页脚。
C. 是页脚
综合大家的想法和评论中的一些建议,可以做到以下几点:
通过在 Document
实例上设置页边距为页脚和页眉保留 space,确保不会放置添加到 Document
的内容他们。
像您已经完成的那样添加页脚和页眉事件。
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName));
Document doc = new Document(pdfDoc);
int headerHeight = 100;
int footerHeight = 200;
float[] oldMargins = new float[] {doc.getTopMargin(), doc.getRightMargin(), doc.getBottomMargin(),
doc.getLeftMargin()};
doc.setMargins(doc.getTopMargin() + headerHeight, doc.getRightMargin(), doc.getBottomMargin() + footerHeight,
doc.getLeftMargin());
pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, new IEventHandler() {
@Override
public void handleEvent(Event event) {
PdfDocumentEvent pdfDocumentEvent = (PdfDocumentEvent) event;
PdfPage page = pdfDocumentEvent.getPage();
Rectangle pageRectangle = page.getPageSize();
Rectangle headerArea = new Rectangle(oldMargins[3], pageRectangle.getTop() - oldMargins[0] - headerHeight,
pageRectangle.getWidth() - oldMargins[1] - oldMargins[3], headerHeight);
new Canvas(page, headerArea).add(
new Div()
.setHeight(headerArea.getHeight())
.setWidth(headerArea.getWidth())
.setBackgroundColor(ColorConstants.RED))
.close();
}
});
pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new IEventHandler(){
@Override
public void handleEvent(Event event) {
PdfDocumentEvent pdfDocumentEvent = (PdfDocumentEvent) event;
PdfPage page = pdfDocumentEvent.getPage();
Rectangle pageRectangle = page.getPageSize();
Rectangle footerArea = new Rectangle(oldMargins[3], pageRectangle.getBottom() + oldMargins[2],
pageRectangle.getWidth() - oldMargins[1] - oldMargins[3], footerHeight);
new Canvas(page, footerArea).add(
new Div()
.setHeight(footerArea.getHeight())
.setWidth(footerArea.getWidth())
.setBackgroundColor(ColorConstants.YELLOW))
.close();
}
});
for (int i = 0; i < 100; i++) {
doc.add(new Paragraph("I'm body's paragraph #" + i));
}
doc.close();
生成的 PDF 看起来符合预期(没有内容溢出页脚和页眉):
如何获取当前页码?
用例:使用itext5编写的应用需要使用itext7重写。 我们的应用程序为我们客户的每月账单生成 PDF 文件。
pdf 的结构:
创建文档:
PdfWriter writer = new PdfWriter(new FileOutputStream(filename)); PdfDocument pdfDocument = new PdfDocument(writer); Document document = new Document(pdfDocument, PageSize.A4); document.setMargins(82, 35, 0, 38); buildBody(pdfData, document, writer); pdfDocument.addEventHandler(PdfDocumentEvent.START_PAGE, new PdfStartPageHandler<>(pdfData, document, this)); pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new PdfEndPageHandler(document)); buildBodyContent(pdfData, document, writer); document.close();
2.Each IEventHandler 实例具有此格式(矩形值除外):
public void handleEvent(Event event) {
document.add(lineSeparatorHeader);
document.add(paragraphInfo); //
document.add(lineSeparatorHeader);
}
paragraphInfo - 是一个 Paragraph(),它由一个 table 和两列组成
lineSeparatorHeader - 是一个 LineSeparator()
- buildBody(pdfData, document, writer) 必须填写我的 pdf 页面的 body。
我的问题是我不知道如何处理内容超出矩形大小的情况。我希望它创建一个新页面,生成一个具有相同尺寸的新矩形并继续在那里书写。
一个。是需要在每个页面上的 header B. 是 body 其内容可能会占据一个以上的页面。如果它占用超过一页,新页面还必须包含 header 和页脚。 C. 是页脚
综合大家的想法和评论中的一些建议,可以做到以下几点:
通过在
Document
实例上设置页边距为页脚和页眉保留 space,确保不会放置添加到Document
的内容他们。像您已经完成的那样添加页脚和页眉事件。
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName)); Document doc = new Document(pdfDoc); int headerHeight = 100; int footerHeight = 200; float[] oldMargins = new float[] {doc.getTopMargin(), doc.getRightMargin(), doc.getBottomMargin(), doc.getLeftMargin()}; doc.setMargins(doc.getTopMargin() + headerHeight, doc.getRightMargin(), doc.getBottomMargin() + footerHeight, doc.getLeftMargin()); pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, new IEventHandler() { @Override public void handleEvent(Event event) { PdfDocumentEvent pdfDocumentEvent = (PdfDocumentEvent) event; PdfPage page = pdfDocumentEvent.getPage(); Rectangle pageRectangle = page.getPageSize(); Rectangle headerArea = new Rectangle(oldMargins[3], pageRectangle.getTop() - oldMargins[0] - headerHeight, pageRectangle.getWidth() - oldMargins[1] - oldMargins[3], headerHeight); new Canvas(page, headerArea).add( new Div() .setHeight(headerArea.getHeight()) .setWidth(headerArea.getWidth()) .setBackgroundColor(ColorConstants.RED)) .close(); } }); pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new IEventHandler(){ @Override public void handleEvent(Event event) { PdfDocumentEvent pdfDocumentEvent = (PdfDocumentEvent) event; PdfPage page = pdfDocumentEvent.getPage(); Rectangle pageRectangle = page.getPageSize(); Rectangle footerArea = new Rectangle(oldMargins[3], pageRectangle.getBottom() + oldMargins[2], pageRectangle.getWidth() - oldMargins[1] - oldMargins[3], footerHeight); new Canvas(page, footerArea).add( new Div() .setHeight(footerArea.getHeight()) .setWidth(footerArea.getWidth()) .setBackgroundColor(ColorConstants.YELLOW)) .close(); } }); for (int i = 0; i < 100; i++) { doc.add(new Paragraph("I'm body's paragraph #" + i)); } doc.close();
生成的 PDF 看起来符合预期(没有内容溢出页脚和页眉):