Java实现PDF文件生成并且打印pdf文件(附demo)

您所在的位置:网站首页 数据库自动生成网页表单 Java实现PDF文件生成并且打印pdf文件(附demo)

Java实现PDF文件生成并且打印pdf文件(附demo)

2023-09-03 21:52| 来源: 网络整理| 查看: 265

Java实现PDF生成并且打印pdf文件(附demo) 目录: 0. 效果预览 1. 准备环境 2. Java如何调用打印机进行打印 3. Java如何生成pdf打印文件 4. 实现pdf内数据动态填充(可按需求改变数据,有一个模板就行) 效果预览: 说明:以下是根据不同用户数据和自己生成的pdf模板,动态生成的pdf文件,可直接调用打印机打印。数据可从数据库动态获取并且填充 在这里插入图片描述 环境准备: 1. java标准开发环境 2. 打印机一台(确保已和设备连接),测试的时候要用,开发没有打印机也行 3. 相关jar包 - pdfbox - itextpdf - commons-logging.jar 实现Java调用打印机进行打印文件

之前写过一篇,多种方式,有兴趣的可以看看。点击这里查看

这里使用的是PDFBox方式实现打印,引入PDFBox.jar和commons-logging.jar,嫌麻烦地可以在文章底部下载demo,我把所有相关的jar,源码都放进去了

传入文件对象即可进行打印,打印前请确认打印机是否正常连接!!!!

/** * 打印实现类 * createTime:2018-08-01 * * @author Jason * */ public final class JHPrintor { /** 日志记录对象 */ private static Logger log = Logger.getLogger(JHPrintor.class); /** 私有构造器 */ private JHPrintor() { } /** * 打印pdf文件 * * @param file 需打印的pdf文件 */ public static void print(File file) { try { PDDocument document = PDDocument.load(file); // 加载成打印文件 PDFPrintable printable = new PDFPrintable(document,Scaling.ACTUAL_SIZE); PrinterJob job = PrinterJob.getPrinterJob(); job.setPrintable(printable); job.defaultPage(); job.print(); } catch (InvalidPasswordException e) { log.error("打印异常:文档初始化密码失败!"); PromptUtil.error("初始化文档密码异常,打印失败!"); e.printStackTrace(); } catch (IOException e) { log.error("打印异常!"); PromptUtil.error("打印异常,请关闭后重试!"); e.printStackTrace(); } catch (PrinterException e) { log.error("未正常连接打印机"); PromptUtil.error("请检查打印机是否正常连接!"); e.printStackTrace(); } } } Java如何生成pdf文件

这个比较复杂,涉及到单元格,表,段落,标题等内容 慢慢来,一步一步讲解一下

/** * 生成pdf文件的工具类 * createTime:2018-08-01 * * @author Jason * */ public class JHCreatePDF { // 日志记录对象 public static Logger log = Logger.getLogger(JHCreatePDF.class); // 系统字体文件在 Windows/Fonts目录下,将其粘到src下即可 public static final String CHARACTOR_FONT_CH_FILE = "/SIMSUN.TTC,1"; //宋体 常规 // 纸张尺寸 public static final Rectangle PAGE_SIZE = PageSize.A4; // 边距 public static final float MARGIN_LEFT = 50; public static final float MARGIN_RIGHT = 50; public static final float MARGIN_TOP = 50; public static final float MARGIN_BOTTOM = 50; public static final float SPACING = 20; // 文件对象 private Document document = null; private File file; /** * 功能:创建导出数据的目标文档 * @return */ public void createDocument() { // 创建pdf文件 FileOutputStream out = null; document = new Document(PAGE_SIZE, MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP, MARGIN_BOTTOM); try { file = File.createTempFile("temp", ".pdf"); } catch (IOException e1) { Log.error("创建临时打印文件失败!"); PromptUtil.error("创建临时打印文件失败,请关闭重试"); e1.printStackTrace(); return; // 结束后续运行 } try { out = new FileOutputStream(file); PdfWriter.getInstance(document, out); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } // 打开文档准备写入内容 document.open(); } /** * 功能 创建PDF文档中的章节 * @param title 章节标题 * @param chapterNum 章节序列号 * @param alignment 0表示align=left,1表示align=center * @param numberDepth 章节是否带序号 设值=1 表示带序号 1.章节一;1.1小节一...,设值=0表示不带序号 * @param font 字体格式 * @return Chapter章节 */ public static Chapter createChapter(String title, int chapterNum, int alignment, int numberDepth, Font font) { Paragraph chapterTitle = new Paragraph(title, font); chapterTitle.setAlignment(alignment); Chapter chapter = new Chapter(chapterTitle, chapterNum); chapter.setNumberDepth(numberDepth); return chapter; } /** * 功能:创建某指定章节下的小节 * @param chapter 指定章节 * @param title 小节标题 * @param font 字体格式 * @param numberDepth 小节是否带序号 设值=1 表示带序号 1.章节一;1.1小节一...,设值=0表示不带序号 * @return section在指定章节后追加小节 */ public static Section createSection(Chapter chapter, String title, Font font, int numberDepth) { Section section = null; if(chapter != null) { Paragraph sectionTitle = new Paragraph(title, font); sectionTitle.setSpacingBefore(SPACING); section = chapter.addSection(sectionTitle); section.setNumberDepth(numberDepth); } return section; } /** * 功能:向PDF文档添加chunk * * @param text * @param font * @return */ public static Chunk createChunk(String text,Font font) { return new Chunk(text, font); } /** * 功能:向PDF文档中添加的内容 (核心句子) * @param text 内容 * @param font 内容对应的字体 * @return phrase 指定字体格式的内容 */ public static Phrase createPhrase(String text,Font font) { Phrase phrase = new Paragraph(text,font); return phrase; } /** * 最后关闭PDF文档 */ public void closeDocument() { if(document != null) { document.close(); } } /** * 读PDF文件,使用了pdfbox开源项目 * @param fileName */ public void readPDF(String fileName) { File file = new File(fileName); FileInputStream in = null; try { in = new FileInputStream(fileName); // 新建一个PDF解析器对象 PDFParser parser = new PDFParser((RandomAccessRead) in); // 对PDF文件进行解析 parser.parse(); // 获取解析后得到的PDF文档对象 PDDocument pdfdocument = parser.getPDDocument(); // 新建一个PDF文本剥离器 PDFTextStripper stripper = new PDFTextStripper(); // 从PDF文档对象中剥离文本 String result = stripper.getText(pdfdocument); System.out.println("PDF文件的文本内容如下:"); System.out.println(result); } catch (Exception e) { System.out.println("读取PDF文件" + file.getAbsolutePath() + "生失败!" + e); e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e1) { } } } } /** * 获取临时文件 * * @return */ public File getTempFile() { if(file == null); log.error("生成的临时文件失败"); return file; } }

这是生成pdf的一个工具类,代码注释写的比较详细,直接看就行 主要讲一下需要注意的地方: 在这里插入图片描述 文件字体:必须有字体文件

// 系统字体文件在 Windows/Fonts目录下,将其粘到src下即可 public static final String CHARACTOR_FONT_CH_FILE = "/SIMSUN.TTC,1"; //宋体 常规 纸张尺寸:设置A4,有别的需求可自行设置 // 纸张尺寸 public static final Rectangle PAGE_SIZE = PageSize.A4; 上下左右边距:就是文件内容距离上下左右四条边的距离,可自行根据需求设置 // 边距 public static final float MARGIN_LEFT = 50; public static final float MARGIN_RIGHT = 50; public static final float MARGIN_TOP = 50; public static final float MARGIN_BOTTOM = 50;

生成pdf时,必须最先调用方法生成document对象,并向里写数据

void createDocument()

pdf内容写完时,最后调用,关闭document对象

void closeDocument() 如何生成模板并填充数据

举个例子 比如生成这个样子: 在这里插入图片描述

private void writeVA(Chapter chapter) { // -------------------------这里开始 到下面写你自己的数据对象解析逻辑 -------- VisualAcuity[] vaArr = {leftPreVA,leftSufVA,rightPreVA,rightSufVA,doublePreVA,doubleSufVA} ; initVA(); // 实例化对象 List vaList = ppe.getVaList(); if (vaList != null&& vaList.size() > 0) { for (VisualAcuity va:vaList ) { fillVisualAcuity(va); } } // --------------------------end ------------------------------------- // 表格标题 JHCreatePDF.createSection(chapter,"视锐度:",titleFont,0); // 生成一个section对象 Section section = JHCreatePDF.createSection(chapter, null, textFont, 0); // 创建表格对象, 按需求初始化4列 PdfPTable table = new PdfPTable(4); PdfPCell cell5 = null; // 第一行 表头 cell5 = new PdfPCell(JHCreatePDF.createPhrase(null,textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); cell5.setColspan(2); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase("单字母视锐度",textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase("行字母视锐度",textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase("拥挤字母视锐度",textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); // 第二行 cell5 = new PdfPCell(JHCreatePDF.createPhrase("左眼",textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); cell5.setPaddingTop(7); cell5.setRowspan(2); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase("训练前",textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase("填写你的数据”,textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(leftPreVA.getLineLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(leftPreVA.getCrowdLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase("训练后",textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(leftSufVA.getSingleLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(leftSufVA.getLineLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(leftSufVA.getCrowdLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); // 第三行 cell5 = new PdfPCell(JHCreatePDF.createPhrase("右眼",textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); cell5.setPaddingTop(7); cell5.setRowspan(2); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase("训练前",textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(rightPreVA.getSingleLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(rightPreVA.getLineLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(rightPreVA.getCrowdLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase("训练后",textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(rightSufVA.getSingleLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(rightSufVA.getLineLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(rightSufVA.getCrowdLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); // 第四行 cell5 = new PdfPCell(JHCreatePDF.createPhrase("双眼",textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); cell5.setRowspan(2); cell5.setPaddingTop(7); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase("训练前",textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(doublePreVA.getSingleLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(doublePreVA.getLineLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(doublePreVA.getCrowdLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase("训练后",textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(doubleSufVA.getSingleLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(doubleSufVA.getLineLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); cell5 = new PdfPCell(JHCreatePDF.createPhrase(doubleSufVA.getCrowdLetter(),textFont)); cell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); table.addCell(cell5); table.setWidthPercentage(100); // 填充度,百分百填充 section.add(table); }

为什么说是动态呢?? 因为这里使用的只是数据对象模型,只要是这种模型,不同数据的对象就会填充不同的数据,生成内容不同的pdf!

整个流程涉及到pdf如何存储,打印,以及销毁! 下面说说我的思路: 我将生成的pdf存放在系统的临时文件夹中 生成下一个打印文件时,定时检测pdf文件数量,然后删除之前生产的pdf文件

到这里,基本打印,生产,数据填充,文件销毁基本写完

下载demo源码,包含所有相关jar包,以及工具类和完整代码 点击这里下载



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3