Java实现PDF文件生成并且打印pdf文件(附demo)
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<VisualAcuity> 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包,以及工具类和完整代码
点击这里下载
Java实现PDF文件生成并且打印pdf文件(附demo)相关推荐
- java生成pdf_Java实现PDF文件生成并且打印pdf文件 demo
## Java实现PDF生成并且打印pdf文件(附demo) #### 目录: 0. 效果预览 1. 准备环境 2. Java如何调用打印机进行打印 3. Java如何生成pdf打印文件 4. 实现p ...
- Java/web/jsp根据pdf模板生成荣誉证书PDF文件
Java/web/jsp根据pdf模板生成荣誉证书PDF文件 1.前言 最近博主在开发一个大学生学分管理系统,按照对方用户的要求,他们需要一个生成PDF荣誉证书的功能. 于是Java根据pdf模板生成 ...
- 根据pdf模板生成新的pdf文件(Java)
根据pdf模板生成新的pdf文件 一.项目依赖 二.所用工具类 三.其他资料 一.项目依赖 1.maven版本:3.5.x 2.pom文件依赖 <!--itext的依赖jar--> < ...
- java根据pdf模板生成新的pdf
文章目录 第一步 制作模板 第二步 引入POM 第三步 根据模板生成PDF 如何填充图片数据 如何让填充的数据进行换行 总结 最近有需求要根据现有的PDF模板生成新的PDF出来,网上资料一大堆,主要总 ...
- Aspose.Word企业案例:Lewin Technology 使用 Aspose.PDF for .NET 开发了电子 PDF 文件生成和打印系统
关于Lewin Technology Lewin Technology 是中国山东省应用创新的主力企业.Lewin Technology 专注于互联网.移动互联网.融合通信等多个产品领域的信息应用系统 ...
- python打印pdf文件_Python静默打印PDF到特定的打印机
我有一个PDF文档,我想用我的 python应用程序打印它. 我使用的方式是使用命令os.startfile('PDFfile.pdf',"print"),但它打开默认查看器(我的 ...
- html表格打印成pdf格式文件,使用html2pdf打印PDF格式文件中的数据作为PDF文件
我想从表单文章中获取一些数据并将其输出到PDF2文件中,并在同一页面上使用html2pdf.但是,当试图将表单数据发布到同一页面时,它不会打开PDF文件,这可能是因为PHP文件的其余部分将出现在if( ...
- JAVA利用keytool工具生成.crt和.key文件
1.生成一个名称为zhanghaiwen的证书 keytool -genkeypair -alias "zhanghaiwen" -keyalg "RSA" - ...
- js打印pdf 使用Adobe reader 打印pdf
最近工作上有需要在js中打印pdf文件,从中遇到了一些问题,到现在已经解决了,做个记录.希望能帮到有需要的人. 我这边主要采用Adobe reader进行加载打印. ...
- 使用PDF处理控件Aspose.PDF以编程方式打印PDF文档完整攻略
许多公司在很大程度上减少了纸张的使用.但是,在某些情况下打印很重要.例如,系统可能包含PDF格式的在线订单的详细信息.他们需要在分发在线订单进行交付时打印PDF.他们大规模处理项目,因此手动打印每个文 ...
最新文章
- Writing Images to the Excel Sheet using PHPExcel--转载
- kl距离 java_信息量、熵、最大熵、联合熵、条件熵、相对熵、互信息。
- OpenCV-图像的基本操作-01
- 非阻塞I/O多路复用机制
- Agglomerative Hierarchical Algorithms(凝聚式层次聚类)
- 方法、hadoop源码之JobQueueTaskScheduler-by小雨
- 在函数中如何获取 线程对象、线程唯一ID
- 如何从计算机中删除 Exchange Server 2003
- JavaScript不用临时变量交换两个变量的值的七种解决方案
- android 盒子刷机教程,安卓机顶盒刷机 最简单的刷机教程【图文教程】
- 计算机体系结构(国防科大)-第四章-指令级并行
- 震惊,java8 Nashorn和laytpl居然能擦出这样火花!
- linux系统文件颜色所代表的意思
- 关于security_huks安全模块的知识总结(一)
- 超好用的windows文件资源管理器软件推荐
- BMapGL实现地图轨迹运动(地图视角不变)
- ChemDraw如何画聚合物,看完就知道了!
- 19、网络配线架打线工艺
- 【Spark GraphX】社交网图分析
- 阿里开源支持10万亿模型的自研分布式训练框架EPL