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 прилагает немало усилий, чтобы скрыть эту разницу от вас, но нам все же придется немного здесь разобраться ... таким образом, отрицательные координаты в ограничительной рамке и местах рисования.
Это все "задняя часть салфетки ", и вполне возможно, что я допустил одну или две ошибки ... но это идея.