Browse Source

fix:pdf导出优化

master
15881625488@163.com 4 days ago
parent
commit
ee04f80859
1 changed files with 68 additions and 111 deletions
  1. +68
    -111
      hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/PdfUtil.java

+ 68
- 111
hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/PdfUtil.java View File

@ -32,11 +32,11 @@ public class PdfUtil {
/**
* 导出form
* @param qm
* @param headerText
* @param fileDir
* @return
*/
public static String exportForm(String qm,String fileDir) {
public static String exportForm(String headerText,String fileDir) {
Document document = null;
FileOutputStream fos = null;
String filePath = "";
@ -52,13 +52,21 @@ public class PdfUtil {
// 3. 完整文件路径
filePath = Paths.get(fileDir, fileName).toString();
// 4. 创建PDF文档
document = new Document(PageSize.A4);
// 创建PDF文档 设置文档边距避免内容遮挡页眉页脚
float topMargin = 70; // 顶部边距为页眉留出空间
float bottomMargin = 60; // 底部边距为页脚留出空间
float leftMargin = 50; // 左边距
float rightMargin = 50; // 右边距
document = new Document(PageSize.A4,
leftMargin, rightMargin, topMargin, bottomMargin);
fos = new FileOutputStream(filePath);
PdfWriter writer = PdfWriter.getInstance(document, fos);
// 使用完整的页脚处理器
writer.setPageEvent(new CompletePdfFooter());
// 设置页面事件每页添加文字页眉
writer.setPageEvent(new TextHeaderEvent(headerText));
// 5. 设置PDF属性
document.addTitle("华西海圻");
@ -67,28 +75,6 @@ public class PdfUtil {
document.addCreationDate();
document.open();
// 6. 设置中文字体
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font titleFont = new Font(bfChinese, 16, Font.BOLD);
// 7. 添加签名
Paragraph title = new Paragraph(qm, titleFont);
title.setAlignment(Element.ALIGN_CENTER);
title.setSpacingAfter(20);
document.add(title);
//横线
LineSeparator line = new LineSeparator();
line.setLineWidth(0.5f);
// 设置100%宽度
line.setPercentage(100f); // 百分比宽度
// 设置对齐方式
line.setAlignment(Element.ALIGN_CENTER); // Element.ALIGN_CENTER, Element.ALIGN_LEFT等
// 设置颜色
line.setLineColor(BaseColor.BLACK);
// 添加到文档
document.add(line);
Map<String, String> formData = new LinkedHashMap<>();
formData.put("姓名","张三");
formData.put("性别", "男");
@ -117,11 +103,11 @@ public class PdfUtil {
/**
* 导出table
* @param qm
* @param headerText
* @param fileDir
* @return
*/
public static String exportTable( String qm,String fileDir) {
public static String exportTable( String headerText,String fileDir) {
Document document = null;
FileOutputStream fos = null;
String filePath = "";
@ -138,13 +124,21 @@ public class PdfUtil {
// 3. 完整文件路径
filePath = Paths.get(fileDir, fileName).toString();
// 4. 创建PDF文档
document = new Document(PageSize.A4);
// 创建PDF文档 设置文档边距避免内容遮挡页眉页脚
float topMargin = 70; // 顶部边距为页眉留出空间
float bottomMargin = 60; // 底部边距为页脚留出空间
float leftMargin = 50; // 左边距
float rightMargin = 50; // 右边距
document = new Document(PageSize.A4,
leftMargin, rightMargin, topMargin, bottomMargin);
fos = new FileOutputStream(filePath);
PdfWriter writer = PdfWriter.getInstance(document, fos);
// 使用完整的页脚处理器
writer.setPageEvent(new CompletePdfFooter());
// 设置页面事件每页添加文字页眉
writer.setPageEvent(new TextHeaderEvent(headerText));
// 5. 设置PDF属性
document.addTitle("华西海圻");
document.addAuthor("华西海圻");
@ -155,28 +149,9 @@ public class PdfUtil {
// 6. 设置中文字体
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font titleFont = new Font(bfChinese, 18, Font.BOLD);
Font headerFont = new Font(bfChinese, 12, Font.BOLD);
Font contentFont = new Font(bfChinese, 10, Font.NORMAL);
// 7. 添加签名
Paragraph title = new Paragraph(qm, titleFont);
title.setAlignment(Element.ALIGN_CENTER);
title.setSpacingAfter(20);
document.add(title);
//横线
LineSeparator line = new LineSeparator();
line.setLineWidth(0.5f);
// 设置100%宽度
line.setPercentage(100f); // 百分比宽度
// 设置对齐方式
line.setAlignment(Element.ALIGN_CENTER); // Element.ALIGN_CENTER, Element.ALIGN_LEFT等
// 设置颜色
line.setLineColor(BaseColor.BLACK);
// 添加到文档
document.add(line);
// 9. 创建表格
PdfPTable table = new PdfPTable(3);
table.setWidthPercentage(100);
@ -311,78 +286,60 @@ public class PdfUtil {
/**
*
* 面事件处理类 - 每页添加文字页眉
*/
public static class CompletePdfFooter extends PdfPageEventHelper {
private Font footerFont;
private PdfTemplate total;
private int totalPages = 0;
public CompletePdfFooter() {
try {
BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
footerFont = new Font(baseFont, 10, Font.NORMAL, BaseColor.GRAY);
} catch (Exception e) {
footerFont = new Font(Font.FontFamily.HELVETICA, 10, Font.NORMAL, BaseColor.GRAY);
}
}
@Override
public void onOpenDocument(PdfWriter writer, Document document) {
total = writer.getDirectContent().createTemplate(100, 16);
static class TextHeaderEvent extends PdfPageEventHelper {
private String headerText;
private BaseFont baseFont;
public TextHeaderEvent(String headerText) throws Exception {
this.headerText = headerText;
// 创建字体支持中文
this.baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
}
@SneakyThrows
@Override
public void onEndPage(PdfWriter writer, Document document) {
PdfContentByte cb = writer.getDirectContent();
int currentPage = writer.getPageNumber();
float y = document.bottom() - 20;
// 在每一页都重新计算确保位置准确
String pageText = "第 " + currentPage + " 页 / 共 ";
BaseFont baseFont = footerFont.getBaseFont();
try {
// 获取页面尺寸
Rectangle pageSize = document.getPageSize();
float pageWidth = pageSize.getWidth();
float pageHeight = pageSize.getHeight();
// 计算页面文本宽度
float pageTextWidth = baseFont.getWidthPoint(pageText, footerFont.getSize());
// 设置页眉参数
float topMargin = 30; // 顶部边距
float fontSize = 12; // 字体大小
// 临时用估计的总页数计算位置等文档关闭后会被替换
String tempTotal = String.valueOf(writer.getPageNumber() + 5); // 估计值
float totalWidth = baseFont.getWidthPoint(tempTotal, footerFont.getSize());
// 计算文字宽度用于居中
float textWidth = baseFont.getWidthPoint(headerText, fontSize);
// 计算起始位置
float totalTextWidth = pageTextWidth + totalWidth +
baseFont.getWidthPoint(" 页", footerFont.getSize());
float startX = (document.getPageSize().getWidth() - totalTextWidth) / 2;
// 计算居中位置
float textX = (pageWidth - textWidth) / 2;
float textY = pageHeight - topMargin;
// 写入当前页信息
ColumnText.showTextAligned(cb, Element.ALIGN_LEFT,
new Phrase(pageText, footerFont), startX, y, 0);
// 获取画布
PdfContentByte canvas = writer.getDirectContent();
// 添加总页数模板
cb.addTemplate(total, startX + pageTextWidth, y);
// 添加页眉文字
canvas.beginText();
canvas.setFontAndSize(baseFont, fontSize);
canvas.setTextMatrix(textX, textY);
canvas.showText(headerText);
canvas.endText();
// 写入"页"
ColumnText.showTextAligned(cb, Element.ALIGN_LEFT,
new Phrase(" 页", footerFont), startX + pageTextWidth + totalWidth, y, 0);
// 添加页眉分隔线可选
addHeaderLine(canvas, pageWidth, textY - 10);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onCloseDocument(PdfWriter writer, Document document) {
totalPages = writer.getPageNumber();
String totalPagesStr = String.valueOf(totalPages);
// 重新创建合适宽度的模板
BaseFont baseFont = footerFont.getBaseFont();
total.beginText();
total.setFontAndSize(baseFont, footerFont.getSize());
total.setTextMatrix(0, 0);
total.showText(totalPagesStr);
total.endText();
private void addHeaderLine(PdfContentByte canvas, float pageWidth, float yPos) {
canvas.setLineWidth(0.5f);
canvas.moveTo(50, yPos);
canvas.lineTo(pageWidth - 50, yPos);
canvas.stroke();
}
}
}

Loading…
Cancel
Save