【发布时间】:2016-10-11 16:03:04
【问题描述】:
我的任务是创建一个工作订单应用程序,其中 输出是用于从浏览器打印的 PDF。输出必须是一个 PDF 包含一个或多个“工单”的文件。由于内容长度可变,每个工作订单可能不止一个打印页。每个工单必须有自己的“页”编号。我正在使用 Spring MVC 和 Itext 5。
假设我们有三个工单。第一个将适合打印的 页,第二个需要打印两页,第三个需要打印一页。我们一共打印了四页。
如何做到这一点: 工单一的页码为“1” 工单 2 的页码为“1, 2” 工单三将页码“1”
所以基本上PDF文档将是多个内部的容器 相互独立的文档。
我尝试重置页码并使用页脚进行输出,但这似乎不起作用。我想知道是否有某种方法可以设置我可以控制的自定义页面计数器。
public class PDFBuilder extends AbstractITextPdfView
{
@Override
protected void buildPdfDocument(Map<String, Object> model, Document doc,
PdfWriter writer, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
@SuppressWarnings("unchecked") // TODO replace this with some generic goodness
List<WorkOrderDto> workOrders = (List<WorkOrderDto>) model.get("workOrders");
Integer pageCounter = 1;
// define table header cell
PdfPCell cell = new PdfPCell();
cell.setBackgroundColor(BaseColor.BLUE);
cell.setPadding(5);
// define font for table header row
Font font = FontFactory.getFont(FontFactory.HELVETICA);
font.setColor(BaseColor.WHITE);
writer.setPageEvent(new Footer(pageCounter));
for (WorkOrderDto dto : workOrders)
{
PdfPTable woHeader = new PdfPTable(4);
woHeader.setWidthPercentage(100.0f);
woHeader.setSpacingBefore(10);
if (dto.getNumber() != null)
{
woHeader.addCell("Number: " + dto.getNumber());
}
else
{
woHeader.addCell("Number: ");
}
if (dto.getOwnerNumber() != null)
{
woHeader.addCell("Owner: " + dto.getOwnerNumber());
}
else
{
woHeader.addCell("Owner: ");
}
if (dto.getTypeNumber() != null)
{
woHeader.addCell("Type: " + dto.getTypeNumber());
}
else
{
woHeader.addCell("Type: ");
}
if (dto.getScheduleDate() != null)
{
woHeader.addCell("Open Date: " + dto.getScheduleDate().toString());
}
else
{
woHeader.addCell("Open Date: ");
}
doc.add(woHeader);
PdfPTable servicesTable = new PdfPTable(4);
for (ServiceDto serviceDto : dto.getCurrentServices())
{
servicesTable.addCell("Number: " + serviceDto.getNumber());
servicesTable.addCell("Name: " + serviceDto.getName());
servicesTable.addCell("Description: " + serviceDto.getDescription());
servicesTable.addCell("Status: " + serviceDto.getStatus());
}
doc.add(servicesTable);
doc.newPage();
pageCounter++;
}
}
}
public class Footer implements PdfPageEvent
{
Font ffont = new Font(Font.FontFamily.UNDEFINED, 10, Font.ITALIC);
Integer pageCounter;
public Footer(Integer pageCounter)
{
this.pageCounter = pageCounter;
}
@Override
public void onOpenDocument(PdfWriter writer, Document document)
{
}
@Override
public void onStartPage(PdfWriter writer, Document document)
{
}
@Override
public void onEndPage(PdfWriter writer, Document document)
{
PdfContentByte cb = writer.getDirectContent();
Phrase footer = new Phrase(pageCounter + "", ffont);
ColumnText.showTextAligned(cb, Element.ALIGN_CENTER,
footer,
(document.right() - document.left()) / 2 + document.leftMargin(),
document.bottom() - 10, 0);
}
@Override
public void onCloseDocument(PdfWriter writer, Document document)
{
}
@Override
public void onParagraph(PdfWriter writer, Document document, float paragraphPosition)
{
}
@Override
public void onParagraphEnd(PdfWriter writer, Document document, float paragraphPosition)
{
}
@Override
public void onChapter(PdfWriter writer, Document document, float paragraphPosition, Paragraph title)
{
}
@Override
public void onChapterEnd(PdfWriter writer, Document document, float paragraphPosition)
{
}
@Override
public void onSection(PdfWriter writer, Document document, float paragraphPosition, int depth, Paragraph title)
{
}
@Override
public void onSectionEnd(PdfWriter writer, Document document, float paragraphPosition)
{
}
@Override
public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text)
{
}
}
【问题讨论】:
标签: itext