简体   繁体   English

如何更改Android中每个PDF页面的标题

[英]how to change header for every pdf page in android

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. 我在Android应用程序中使用itext创建了pdf页面,需要为pdf页面添加页眉和页脚,并且需要在每个页面中更改页眉。

i did like for adding header and footer 我喜欢添加页眉和页脚

public class HeaderAddFooter extends PdfPageEventHelper { 公共类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);


}

} }

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 我如何动态地为每个页面更改标题

When asked how he adds new values to header, the OP clarified in a comment that he does so by 当被问及他如何向标头添加新值时, OP在评论中阐明了他这样做的方式

sending values to constructor for each page 向每个页面的构造函数发送值

This seems to indicate that he every once in a while creates a new HeaderAddFooter instance and forwards it to the PdfWriter method setPageEvent . 这似乎表明他偶尔创建一个新的HeaderAddFooter实例,并将其转发到PdfWriter方法setPageEvent

Unfortunately the OP was not able or willing to provide more code. 不幸的是,OP无法或不愿意提供更多代码。 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();

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: 不幸的是,这不能按预期方式工作,因为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;
    }
}

Thus, the OP's assumed code does not replace the former page event listener by a new one but insteads adds to it. 因此,OP的假定代码不会用新的原先的页面事件侦听器代替原先的页面事件侦听器,而是添加了它。

There are two ways to fix this: 有两种方法可以解决此问题:

  • Either set only one HeaderAddFooter instance initially outside the loop and change the contents of its members inside the loop: 最初只在循环外设置一个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(); 

    This most likely will require making those HeaderAddFooter member variables more visible. 这很可能需要使那些HeaderAddFooter成员变量更加可见。 Alternatively setter methods may be added for them. 另外,可以为他们添加setter方法。

  • Or make use of the special treatment of null in PdfWriter.setPageEvent : 或在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(); 

The first alternative (with the use of setter methods for cleaner code) is the more common variant. 第一种选择(使用更清晰的代码使用setter方法)是更常见的变体。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM