如何更改标题为android系统中每个PDF页面 [英] how to change header for every pdf page in android
问题描述
我利用iText在Android应用程序,需要添加页眉和页脚的PDF页面,并需要每一个页面更改标题创建的PDF页面。
I created pdf page using itext in android application,need to add header and footer for pdf page and need to change header in every page.
我不喜欢添加页眉和页脚
i did like for adding header and footer
公共类HeaderAddFooter扩展PdfPageEventHelper {
public class HeaderAddFooter extends 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);
}
}
现在,当添加新值这头象显示合并文本既previous文本和新标题文本。如何更改标题动态的每一页
now when add new values to header it showing like merge text both previous text and new header text. how can i change header dynamically for every page
推荐答案
当问他如何的增加了新的价值,以头,的在评论中阐明了OP,他通过
When asked how he adds new values to header, the OP clarified in a comment that he does so by
发送值构造的每一页
这似乎表明,他每隔一段时间,会创建一个新的 HeaderAddFooter
实例,并将其转发到 PdfWriter
方法 setPageEvent
。
This seems to indicate that he every once in a while creates a new HeaderAddFooter
instance and forwards it to the PdfWriter
method setPageEvent
.
不幸的是,OP是不能或不愿提供更多code。因此,让我们假设他的code看起来像这样
Unfortunately the OP was not able or willing to provide more code. Thus, let's assume his code looks like this
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
是有点名不副实(在Javadoc中也误记录):这是不是一个真正的二传手而是更像一个加法器:
This, unfortunately, does not work as expected because PdfWriter.setPageEvent
is a bit misnamed (and also mis-documented in the Javadocs): It is not a true setter but instead more like an adder:
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的的摆出的code并不能代替由一个新的,但insteads 前者页面事件监听器添加以它
Thus, the OP's assumed code does not replace the former page event listener by a new one but insteads adds to it.
有两种方法来解决这个问题:
There are two ways to fix this:
-
要么只能设置一个
HeaderAddFooter
实例最初循环外,改变循环内成员的内容:
Either set only one
HeaderAddFooter
instance initially outside the loop and change the contents of its members inside the loop:
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方法可以加入他们。
This most likely will require making those HeaderAddFooter
member variables more visible. Alternatively setter methods may be added for them.
或使用空
的特殊待遇的 PdfWriter.setPageEvent
:
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方法清洁code)是较常见的变体。
The first alternative (with the use of setter methods for cleaner code) is the more common variant.
这篇关于如何更改标题为android系统中每个PDF页面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!