PDFBox渲染生成pdf文档
public class Demo01 {
public static void main(String[] args) throws Exception{
// 设定中文字体
File fontFile = new File("C:\\Windows\\Fonts\\simHei.ttf");
try (PDDocument document = new PDDocument()) {
PDType0Font load = PDType0Font.load(document, fontFile);
PDPage page;
for (int i = 0; i < 1; i++) {
page = new PDPage();
document.addPage(page);
// 对具体PDPage设定内容
try(PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
contentStream.setFont(load, 25);
contentStream.beginText();
// newLineAtOffset方法
contentStream.newLineAtOffset(220, 750);
contentStream.showText("借用出库打印单");
contentStream.setFont(load, 12);
contentStream.endText();
// 仓库和会员渲染位置
contentStream.beginText();
contentStream.newLineAtOffset(80, 700); // 80,700
contentStream.showText("仓库:");
contentStream.newLineAtOffset(300, 0); //380,700
contentStream.showText("会员:");
contentStream.endText();
// 销售员和操作人渲染位置
contentStream.beginText();
contentStream.newLineAtOffset(80, 675); // 80,675
contentStream.showText("销售员:");
contentStream.newLineAtOffset(300, 0); //380,675
contentStream.showText("操作人:");
contentStream.endText();
// 操作时间位置
contentStream.beginText();
contentStream.newLineAtOffset(80, 650); // 80,650
contentStream.showText("操作时间:");
contentStream.endText();
// ----------------实际内容-----------------------
// 表头
contentStream.beginText();
contentStream.newLineAtOffset(80, 625); //80,625
contentStream.showText("序号");
contentStream.newLineAtOffset(40, 0); //120,625
contentStream.showText("商品编号");
contentStream.newLineAtOffset(80, 0); //200,625
contentStream.showText("商品名称");
contentStream.newLineAtOffset(70, 0); //270,625
contentStream.showText("单位");
contentStream.newLineAtOffset(40, 0); //310,625
contentStream.showText("借出数量");
contentStream.newLineAtOffset(70, 0); //380,625
contentStream.showText("备注");
contentStream.newLineAtOffset(100, 0); //480,625
contentStream.showText("零售价");
contentStream.endText();
Map<String, String> contentMap = new HashMap<>();
contentMap.put("序号", "1");
contentMap.put("商品编号", "000212130023");
contentMap.put("商品名称", "洗地机124123");
contentMap.put("单位", "个");
contentMap.put("借出数量", "13");
contentMap.put("备注", "我是备注我是备注");
contentMap.put("零售价", "1123300.34");
fillContent(contentStream, contentMap, load);
// 结尾结构渲染
// 合计位置
contentStream.beginText();
contentStream.newLineAtOffset(80, 150); // 80,150
contentStream.showText("合计");
contentStream.endText();
// 出库数量和总金额位置
contentStream.beginText();
contentStream.newLineAtOffset(110, 125); // 110,125
contentStream.showText("出库数量:");
contentStream.newLineAtOffset(270, 0); // 380,125
contentStream.showText("总金额:");
contentStream.endText();
// 签名位置
contentStream.beginText();
contentStream.newLineAtOffset(80, 50); // 110,125
contentStream.showText("签名:_______");
contentStream.endText();
// 模拟填充模板
Map<String, String> map = new HashMap<>();
map.put("仓库", "上海仓");
map.put("会员", "小明");
map.put("销售员", "销售员01");
map.put("操作人", "系统管理员");
map.put("操作时间", "2025年4月1日23点07分");
map.put("出库数量", "1455");
map.put("总金额", "285743835.45");
fillTemplate(contentStream, map);
}
}
document.save("demo01.pdf");
System.out.println("PDF created successfully!");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// 填充固定模板方法 该方法不填充中间详细内容
public static void fillTemplate(PDPageContentStream contentStream, Map<String, String> map) {
try {
contentStream.beginText();
contentStream.newLineAtOffset(130, 700);
contentStream.showText(map.get("仓库"));
contentStream.endText();
contentStream.beginText();
contentStream.newLineAtOffset(430, 700);
contentStream.showText(map.get("会员"));
contentStream.endText();
contentStream.beginText();
contentStream.newLineAtOffset(130, 675);
contentStream.showText(map.get("销售员"));
contentStream.endText();
contentStream.beginText();
contentStream.newLineAtOffset(430, 675);
contentStream.showText(map.get("操作人"));
contentStream.endText();
contentStream.beginText();
contentStream.newLineAtOffset(150, 650);
contentStream.showText(map.get("操作时间"));
contentStream.endText();
contentStream.beginText();
contentStream.newLineAtOffset(180, 125);
contentStream.showText(map.get("出库数量"));
contentStream.endText();
contentStream.beginText();
contentStream.newLineAtOffset(430, 125);
contentStream.showText(map.get("总金额"));
contentStream.endText();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void fillContent(PDPageContentStream contentStream, Map<String, String> map, PDType0Font font) {
try {
contentStream.setFont(font, 10);
contentStream.beginText();
contentStream.newLineAtOffset(80, 600);
contentStream.showText(map.get("序号"));
contentStream.endText();
contentStream.beginText();
contentStream.newLineAtOffset(120, 600);
contentStream.showText(map.get("商品编号"));
contentStream.endText();
contentStream.beginText();
contentStream.newLineAtOffset(200, 600);
contentStream.showText(map.get("商品名称"));
contentStream.endText();
contentStream.beginText();
contentStream.newLineAtOffset(270, 600);
contentStream.showText(map.get("单位"));
contentStream.endText();
contentStream.beginText();
contentStream.newLineAtOffset(310, 600);
contentStream.showText(map.get("借出数量"));
contentStream.endText();
contentStream.beginText();
contentStream.newLineAtOffset(380, 600);
contentStream.showText(map.get("备注"));
contentStream.endText();
contentStream.beginText();
contentStream.newLineAtOffset(480, 600);
contentStream.showText(map.get("零售价"));
contentStream.endText();
contentStream.setFont(font, 12);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}