在使用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();
}
//已找到解决方案。在创建模板时,添加模板文档的边距参数。
public void onOpenDocument(PdfWriter writer, Document document) {
total = writer.getDirectContent().createTemplate(500, 500);// 共 页 的矩形的长宽高
total.setBoundingBox(new Rectangle(-20, -20, 100, 100));
}
在iTextPDF中手写PDF时,页面显示问题可能是由于字体高度设置不正确导致的:
检查字体高度设置:在您的代码中,您使用了BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false)
创建字体。您可以尝试调整字体的大小,以确保字体在页面上完整显示。例如,将字体大小调整为12或14,并查看结果是否改善。
调整矩形模板的高度:在onOpenDocument
方法中,您创建了一个矩形模板来显示“共 页”的信息。您可以尝试调整矩形模板的高度,以确保可以容纳字体的完整显示。例如,将矩形模板的高度从100增加到更大的值,以适应较大的字体高度。
检查字体文件:确保您使用的字体文件(例如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页的字体完整显示为止。请尝试运行修改后的代码,并查看结果是否符合预期。
根据你提供的代码,你似乎已经成功地使用iTextPDF生成了带有页眉、页脚和页码的PDF文档。如果你的问题是关于页码显示问题,请提供更多细节或说明你遇到的具体问题,这样我才能更好地帮助你解决。
目前代码中的onOpenDocument、onEndPage和onCloseDocument事件逻辑看起来没有问题,而且在onCloseDocument中你已经成功将总页数插入到模板中。因此,你生成的PDF应该包含正确的页码信息。
但是,请注意以下几点:
确保document对象的页面尺寸和边距设置正确。如果document对象的页面尺寸和边距设置不正确,可能导致页码和文本不正确地显示在页面上。
确保你的PDF文档的内容足够多,以使得分页发生。如果内容较少,可能不会出现多页,因此页码总是显示为第一页。
如果你的PDF文档的内容超过一页,并且页码仍然不正确显示,请检查是否有其他地方对页码进行了修改或覆盖。例如,其他地方可能会调用writer.setPageEvent(someOtherPageEvent)来覆盖原始的页码事件。
如果你能提供更多信息,比如出现的具体问题,或者给出生成的PDF文档的示例,我将能够更好地帮助你找到解决方案。
感谢大佬支持,页眉页脚已经正常生成,而且数据是测试用的假数据,也满足分页条件,再页眉插入“第几页/共几页”这几个字眼,在调用onCloseDocument时放入“几页”这两个字,目前的问题就是这个“几页”展示字眼会有部分缺失如我问题中的图片。“第几页/共”这几个字的字体和字体大小和“几页”都是一致的,“第几页/共”展示正常,但是后面的“几页”会有缺失。