如何更改标题为android系统中每个PDF页面 [英] how to change header for every pdf page in android

查看:207
本文介绍了如何更改标题为android系统中每个PDF页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我利用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆