PDFBox渲染生成pdf文档

时间:2025-04-07 07:57:20
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); } } }