首页 新闻 会员 周边 捐助

使用itextpdf生成pdf吗,总页数显示问题

0
[已解决问题] 解决于 2023-07-24 15:16

在使用itextpdf手写pdf时,发现一个很神奇的问题。希望有大佬能给与解答。以下是生成pdf分页的event逻辑。

//生成pdf分页模板,调整了这个高和宽没有影响到字体的展示
public void onOpenDocument(PdfWriter writer, Document document) {
total = writer.getDirectContent().createTemplate(100, 100);// 共 页 的矩形的长宽高
}

//每一页结束时,写入页眉和页脚
public void onEndPage(PdfWriter writer, Document document) {

    try {
        if (bf == null) {
            bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
        }

        if (fontDetail == null){
            fontDetail = new Font(bf, 10, Font.NORMAL, BaseColor.BLACK);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    //拿到当前的PdfContentByte
    PdfContentByte cb = writer.getDirectContent();

    // 写入前半部分的 第 X页/共
    int pageS = writer.getPageNumber();
    String header = "第" + pageS + "页/共";
    Phrase phraseFeader = new Phrase(header, fontDetail);
    float len = bf.getWidthPoint(header, 10);

    // 写入页眉1
    ColumnText.showTextAligned(cb, Element.ALIGN_RIGHT, phraseFeader, document.right() - 20, document.top() + 20, 0);

    // 写入页眉2的模板(就是页脚的Y页这俩字)添加到文档中
    cb.addTemplate(total, document.right() - 20 , document.top() + 20, true); // 调节模版显示的位置

    //添加单页分割线
    cb.saveState();
    cb.setLineWidth(0.5f);
    cb.setLineDash(new float[] { 5.0f, 5.0f }, 0);
    cb.moveTo(document.left(),document.bottom()-10);//起点
    cb.lineTo(document.right(),document.bottom()-10);//终点
    cb.stroke();
    cb.restoreState();

    //写入页脚
    ColumnText.showTextAligned(cb, Element.ALIGN_LEFT,  new Phrase("这是页脚", fontDetail), document.left(), document.bottom() - 20, 0);
}

//在文档关闭时,插入总页数

public void onCloseDocument(PdfWriter writer, Document document) {
// 最后一步,就是关闭文档的时候,将模板替换成实际的 Y 值,至此,page x of y 制作完毕,完美兼容各种文档size。
total.beginText();
total.setFontAndSize(bf, 10);// 生成的模版的字体、颜色
String header2 = (writer.getPageNumber() - 1) + "页";
total.showText(header2);// 模版显示的内容
total.endText();
total.closePath();
}

yangjianxi的主页 yangjianxi | 菜鸟二级 | 园豆:204
提问于:2023-07-21 15:29
< >
分享
最佳答案
0

//已找到解决方案。在创建模板时,添加模板文档的边距参数。
public void onOpenDocument(PdfWriter writer, Document document) {
total = writer.getDirectContent().createTemplate(500, 500);// 共 页 的矩形的长宽高
total.setBoundingBox(new Rectangle(-20, -20, 100, 100));
}

yangjianxi | 菜鸟二级 |园豆:204 | 2023-07-24 15:13
其他回答(2)
0

在iTextPDF中手写PDF时,页面显示问题可能是由于字体高度设置不正确导致的:

  1. 检查字体高度设置:在您的代码中,您使用了BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false)创建字体。您可以尝试调整字体的大小,以确保字体在页面上完整显示。例如,将字体大小调整为12或14,并查看结果是否改善。

  2. 调整矩形模板的高度:在onOpenDocument方法中,您创建了一个矩形模板来显示“共 页”的信息。您可以尝试调整矩形模板的高度,以确保可以容纳字体的完整显示。例如,将矩形模板的高度从100增加到更大的值,以适应较大的字体高度。

  3. 检查字体文件:确保您使用的字体文件(例如STSong-Light)是完整的且可用的。有时,字体文件可能损坏或缺失,导致字体显示不正确。

以下是修改后的代码示例:

// 生成pdf分页模板,调整了这个高和宽没有影响到字体的展示
public void onOpenDocument(PdfWriter writer, Document document) {
    total = writer.getDirectContent().createTemplate(100, 100); // 共 页 的矩形的长宽高
}

// 每一页结束时,写入页眉和页脚
public void onEndPage(PdfWriter writer, Document document) {
    try {
        if (bf == null) {
            bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
        }

        // 调整字体的大小,直到第7页的字体完整显示
        int fontSize = 10;
        if (writer.getPageNumber() == 7) {
            fontSize = 12; // 或者其他合适的值
        }

        if (fontDetail == null) {
            fontDetail = new Font(bf, fontSize, Font.NORMAL, BaseColor.BLACK);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    // 拿到当前的PdfContentByte
    PdfContentByte cb = writer.getDirectContent();

    // 写入前半部分的 第 X页/共
    int pageS = writer.getPageNumber();
    String header = "第" + pageS + "页/共";
    Phrase phraseFeader = new Phrase(header, fontDetail);
    float len = bf.getWidthPoint(header, fontDetail.getSize());
    
    // 其他代码...
}

在上述代码中,我添加了一个条件判断,当页码为第7页时,将字体的大小设置为12。您可以根据需要调整字体大小的值,直到第7页的字体完整显示为止。请尝试运行修改后的代码,并查看结果是否符合预期。

lanedm | 园豆:2396 (老鸟四级) | 2023-07-22 11:29
0

根据你提供的代码,你似乎已经成功地使用iTextPDF生成了带有页眉、页脚和页码的PDF文档。如果你的问题是关于页码显示问题,请提供更多细节或说明你遇到的具体问题,这样我才能更好地帮助你解决。

目前代码中的onOpenDocument、onEndPage和onCloseDocument事件逻辑看起来没有问题,而且在onCloseDocument中你已经成功将总页数插入到模板中。因此,你生成的PDF应该包含正确的页码信息。

但是,请注意以下几点:

确保document对象的页面尺寸和边距设置正确。如果document对象的页面尺寸和边距设置不正确,可能导致页码和文本不正确地显示在页面上。

确保你的PDF文档的内容足够多,以使得分页发生。如果内容较少,可能不会出现多页,因此页码总是显示为第一页。

如果你的PDF文档的内容超过一页,并且页码仍然不正确显示,请检查是否有其他地方对页码进行了修改或覆盖。例如,其他地方可能会调用writer.setPageEvent(someOtherPageEvent)来覆盖原始的页码事件。

如果你能提供更多信息,比如出现的具体问题,或者给出生成的PDF文档的示例,我将能够更好地帮助你找到解决方案。

Technologyforgood | 园豆:7688 (大侠五级) | 2023-07-23 23:10

感谢大佬支持,页眉页脚已经正常生成,而且数据是测试用的假数据,也满足分页条件,再页眉插入“第几页/共几页”这几个字眼,在调用onCloseDocument时放入“几页”这两个字,目前的问题就是这个“几页”展示字眼会有部分缺失如我问题中的图片。“第几页/共”这几个字的字体和字体大小和“几页”都是一致的,“第几页/共”展示正常,但是后面的“几页”会有缺失。

支持(0) 反对(0) yangjianxi | 园豆:204 (菜鸟二级) | 2023-07-24 14:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册