【问题标题】:how to change header for every pdf page in android如何更改android中每个pdf页面的标题
【发布时间】:2014-09-21 15:42:44
【问题描述】:

我在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);


}

}

现在当向标题添加新值时,它会像合并文本一样显示以前的文本和新的标题文本。如何为每个页面动态更改标题

【问题讨论】:

  • 当向标题添加新值时,它显示为合并先前文本和新标题文本的文本 - 如何添加新值?我在您的代码中没有看到它。
  • 对于第一页它显示正确然后对于第二页需要在前一个标题上显示新标题时再次发送值
  • 如何添加新值?我在您的代码中没有看到它。您说您的做法以某种方式混合了以前的和当前的标头。使用您显示的无法复制的代码。因此,我们无法告诉您您做错了什么。
  • 向每个页面的构造函数发送值

标签: java android itext


【解决方案1】:

当被问及他如何向标头添加新值时, 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,而是更像一个 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 的假定代码确实不会用新的事件侦听器替换以前的页面事件侦听器,而是添加到它。 p>

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

  • 要么在循环外仅设置一个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 方法。

  • 或者利用nullPdfWriter.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 方法来获得更简洁的代码)是更常见的变体。

【讨论】:

  • 干得好@mkl,但 pdf 页面是员工详细信息,它可能包含 1 或 2 或 3。是否可以使用页面更改标题
  • 请解释一下,我看不出有什么问题。如果您需要更灵活的标题结构,只需在 onPageEnd 中编写一些灵活性即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多