Java 如何在android中更改每个pdf页面的页眉
我在android应用程序中使用itext创建了pdf页面,需要为pdf页面添加页眉和页脚,并且需要更改每个页面的页眉 我确实喜欢添加页眉和页脚 公共类HeaderAddFooter扩展PdfPageEventHelper{Java 如何在android中更改每个pdf页面的页眉,java,android,itext,Java,Android,Itext,我在android应用程序中使用itext创建了pdf页面,需要为pdf页面添加页眉和页脚,并且需要更改每个页面的页眉 我确实喜欢添加页眉和页脚 公共类HeaderAddFooter扩展PdfPageEventHelper{ private Phrase footer; private Phrase header; private String patientName; private String patientID; Font headerFont = new Font(FontFamily
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();
成员变量更加可见。或者,可以为它们添加setter方法HeaderAddFooter
- 或者在
中使用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方法进行更干净的代码)是更常见的变体。当向标题添加新值时,它会像合并文本一样显示以前的文本和新标题文本-如何添加新值?我在您的代码中没有看到它。对于第一页,它正确显示,然后对于第二页,需要在上一页显示新标题时再次发送值。如何添加新值?我在你的代码里没看到。你说你的方式是混合前一个和当前的头球。使用您显示的代码,无法复制。因此,我们无法告诉您做错了什么。为每个页面向构造函数发送值nice work@mkl,但pdf页面是员工详细信息,它可能包含1、2或3。是否可以使用页面更改标题请解释,我看不出有问题。如果您需要更灵活的标题结构,只需在onPageEnd中编程一些灵活性即可。