document.open();
// the same contentByte is returned, it's just flushed & reset during
// new page events.
PdfContentByte cb = writer.getDirectContent();
for (int _pageNumber = 0; _pageNumber < _numberofPages; ++_numberOfPages) {
/*******************/
//harmless in first pass, *necessary* in others
document.newPage();
/*******************/
g2 = cb.createGraphics(_pageWidth, _height);
g2.translate(0, (_numberOfPages - _pageNumber) * _pageHeight);
draw(g2);
g2.dispose();
}
document.close();
因此,您将整个界面渲染N次,并且仅在不同位置显示页面大小的切片.这在印刷世界IIRC中被称为“条带化”.聪明,但它在PDF中可能更有效率.
将整个界面渲染为一个巨大的PdfTemplate(使用g2d),一次.然后将该模板绘制到所有页面中,使得您想要的部分在当前页面的边距内可见(“媒体框”).
PdfContentByte cb = writer.getDirectContent();
float entireHeight = _numberOfPages * _pageHeight;
PdfTemplate hugeTempl = cb.createTemplate( 0, -entireHeight, pageWidth, _pageHeight );
g2 = hugeTempl.createGraphics(0, -entireHeight, _pageWidth, _pageHeight );
draw(g2);
g2.dispose();
for (int curPg = 0; curPg < _numberOfPages; ++curPg) {
cb.addTemplateSimple( hugeTempl, 0, -_pageHeight * curPg );
document.newPage();
}
PDF的坐标空间在左下角设置为0,0,当您向上和向右时,这些值会增加. PdfGraphis2D做了相当多的魔术来隐藏与你的区别,但我们仍然需要在这里处理它…因此在边界框和绘图位置的负坐标.
这就是所有“背面的卫生巾”编码,我完全有可能在那里犯了一两个错误……但这就是主意.