如何更改android中每个pdf页面的标题

我在android应用程序中使用itext创建了pdf页面,需要为pdf页面添加页眉和页脚,并且需要在每个页面中更改标题。

我喜欢添加页眉和页脚

公共类HeaderAddFooter扩展PdfPageEventHelper {

private Phrase footer; private Phrase header; private String patientName; private String patientID; Font headerFont = new Font(FontFamily.TIMES_ROMAN, 12, Font.NORMAL); Font footerFont = new Font(FontFamily.TIMES_ROMAN, 12, Font.NORMAL); Font TitleFont = new Font(FontFamily.COURIER, 14, Font.NORMAL); /* * constructor */ public HeaderAddFooter(String name,String id) { super(); header = new Phrase("***** Header *****"); footer = new Phrase("**** Footer ****"); patientName=name; patientID=id; } @Override public void onStartPage(PdfWriter writer, Document document) { super.onStartPage(writer, document); } @Override public void onEndPage(PdfWriter writer, Document document) { PdfContentByte cb = writer.getDirectContent(); SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); // Date date = new Date(); Calendar cal = Calendar.getInstance(); ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, new Phrase("welcome",headerFont), document.leftMargin()-1, document.top()+10, 0); ColumnText.showTextAligned(cb, Element.ALIGN_RIGHT, new Phrase("Name",headerFont), document.right(), document.top()+15, 0); ColumnText.showTextAligned(cb, Element.ALIGN_RIGHT, new Phrase("Designation",headerFont), document.right(), document.top()+1, 0); /* * Foooter */ ColumnText.showTextAligned(cb, Element.ALIGN_MIDDLE, new Phrase("Page:"+String.format(" %d ", writer.getPageNumber()),footerFont), document.right() - 280 , document.bottom() - 10, 0); ColumnText.showTextAligned(cb, Element.ALIGN_MIDDLE, new Phrase(dateFormat.format(cal.getTime()),footerFont), document.right() - 350 , document.bottom() - 25, 0); } 

}

现在,当向标题添加新值时,它显示合并文本,包括先前文本和新标题文本。 如何为每个页面动态更改标题

当被问及他如何为标题增加新的价值时, OP在评论中澄清说他是这样做的

将值发送到每个页面的构造函数

这似乎表明他每隔一段时间创建一个新的HeaderAddFooter实例并将其转发到PdfWriter方法setPageEvent

不幸的是,OP无法或不愿意提供更多代码。 因此,让我们假设他的代码看起来像这样

 Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, ...); document.open(); for (int page = ...) { String nameForPage = ... String idForPage = ... writer.setPageEvent(new HeaderAddFooter(nameForPage, idForPage)); ... add content for page ... document.newPage(); } document.close(); 

不幸的是,这不能按预期工作,因为PdfWriter.setPageEvent有点错误名称(并且在Javadocs中也有错误记录):它不是真正的setter,而是更像是一个加法器:

 public void setPageEvent(final PdfPageEvent event) { if (event == null) this.pageEvent = null; else if (this.pageEvent == null) this.pageEvent = event; else if (this.pageEvent instanceof PdfPageEventForwarder) ((PdfPageEventForwarder)this.pageEvent).addPageEvent(event); else { PdfPageEventForwarder forward = new PdfPageEventForwarder(); forward.addPageEvent(this.pageEvent); forward.addPageEvent(event); this.pageEvent = forward; } } 

因此,OP的假定代码不会用新的代码替换以前的页面事件监听器,而是添加它。

有两种方法可以解决这个问题:

  • 最初只在循环外部设置一个HeaderAddFooter实例,并在循环内更改其成员的内容:

     Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, ...); document.open(); HeaderAddFooter headerAddFooter = new HeaderAddFooter("", ""); writer.setPageEvent(headerAddFooter); for (int page = ...) { String nameForPage = ... String idForPage = ... headerAddFooter.patientName = nameForPage; headerAddFooter.patientID = idForPage; ... add content for page ... document.newPage(); } document.close(); 

    这很可能需要使这些HeaderAddFooter成员变量更加可见。 或者,可以为它们添加setter方法。

  • 或者在PdfWriter.setPageEvent使用null的特殊处理:

     Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, ...); document.open(); for (int page = ...) { String nameForPage = ... String idForPage = ... writer.setPageEvent(null); writer.setPageEvent(new HeaderAddFooter(nameForPage, idForPage)); ... add content for page ... document.newPage(); } document.close(); 

第一种替代方法(使用更清晰代码的setter方法)是更常见的变体。