我们在我们的应用程序中使用itextpdf和xmlworker API(itextpdf-5.1.1.jar,Xmlworker-1.1.0.jar)来生成PDF生成任务。我们从XML-XSLT转换生成HTML内容,然后使用HTML内容创建pdf文档。
当我们尝试实现分页时(3个中的1个,3个中的2个),我们从itextpdf在线样本中学到了我们总是需要创建一个结果pdf文档,而不是我们创建的PDF文档以便标记每页内容的页码。
这种方法在删除中间pdf文档方面带来了挑战。有没有什么方法可以在我们第一次创建pdf时确定页码,以便我们避免创建一个结果pdf文档?
由于 Venkat
class TableFooter extends PdfPageEventHelper {
String header;
PdfTemplate total;
public void setHeader(String header) {
this.header = header;
}
public void onOpenDocument(PdfWriter writer, Document document) {
total = writer.getDirectContent().createTemplate(30, 16);
}
public void onEndPage(PdfWriter writer, Document document) {
Font ffont = new Font(Font.FontFamily.UNDEFINED, 7, Font.NORMAL);
PdfPTable table = new PdfPTable(2);
try
{
table.setWidths(new int[]{1,1});
table.setTotalWidth(50);
table.getDefaultCell().setFixedHeight(15);
table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
Phrase footer = new Phrase(String.format("%d of", writer.getPageNumber()), ffont);
table.addCell(footer);
PdfPCell cell = new PdfPCell(Image.getInstance(total));
table.addCell(cell);
table.writeSelectedRows(0, -1, 275, 20, writer.getDirectContent());
}
catch(Exception de) {
throw new ExceptionConverter(de);
}
}
public void onCloseDocument(PdfWriter writer, Document document) {
ColumnText.showTextAligned(total, Element.ALIGN_LEFT, new Phrase(String.valueOf(writer.getPageNumber() - 1)), 10, 4, 0);
}
}
答案 0 :(得分:1)
请下载免费的电子书The Best iText Questions on StackOverflow,并阅读“页面活动”一章中列出的问题。这些是为本书选择的一些问题:
您还可以查看官方iText网站上的keywords page,更具体地说,请查看关键字Page X of Y。
在您的问题中,您指的是创建中间文档。这就是TwoPasses示例的内容。您要求在一次传递中添加 Y页面X 。这就是MovieCountries1示例的内容。
class PageXofYHeader extends PdfPageEventHelper {
/** The template with the total number of pages. */
PdfTemplate total;
/**
* Creates the PdfTemplate that will hold the total number of pages.
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(
* com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
*/
public void onOpenDocument(PdfWriter writer, Document document) {
total = writer.getDirectContent().createTemplate(30, 16);
}
/**
* Adds a header to every page
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(
* com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
*/
public void onEndPage(PdfWriter writer, Document document) {
PdfPTable table = new PdfPTable(2);
try {
table.setWidths(new int[]{48, 2});
table.setTotalWidth(527);
table.setLockedWidth(true);
table.getDefaultCell().setFixedHeight(20);
table.getDefaultCell().setBorder(Rectangle.BOTTOM);
table.getDefaultCell()
.setHorizontalAlignment(Element.ALIGN_RIGHT);
table.addCell(
String.format("Page %d of", writer.getPageNumber()));
PdfPCell cell = new PdfPCell(Image.getInstance(total));
cell.setBorder(Rectangle.BOTTOM);
table.addCell(cell);
table.writeSelectedRows(0, -1, 34, 803,
writer.getDirectContent());
}
catch(DocumentException de) {
throw new ExceptionConverter(de);
}
}
/**
* Fills out the total number of pages before the document is closed.
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(
* com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
*/
public void onCloseDocument(PdfWriter writer, Document document) {
ColumnText.showTextAligned(total, Element.ALIGN_LEFT,
new Phrase(String.valueOf(writer.getPageNumber() - 1)),
2, 2, 0);
}
}
如您所见,我们在total
方法中创建了一个名为onOpenDocument()
的小占位符。由于我们事先并不知道总页数是多少,因此我们将此占位符添加到每个页面,而不知道页面总数将是什么。我们只知道关闭文档时的最终页数,这就是我们等到触发onCloseDocument()
方法向占位符添加内容的原因。