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)相关推荐

  1. java生成pdf_Java实现PDF文件生成并且打印pdf文件 demo

    ## Java实现PDF生成并且打印pdf文件(附demo) #### 目录: 0. 效果预览 1. 准备环境 2. Java如何调用打印机进行打印 3. Java如何生成pdf打印文件 4. 实现p ...

  2. Java/web/jsp根据pdf模板生成荣誉证书PDF文件

    Java/web/jsp根据pdf模板生成荣誉证书PDF文件 1.前言 最近博主在开发一个大学生学分管理系统,按照对方用户的要求,他们需要一个生成PDF荣誉证书的功能. 于是Java根据pdf模板生成 ...

  3. 根据pdf模板生成新的pdf文件(Java)

    根据pdf模板生成新的pdf文件 一.项目依赖 二.所用工具类 三.其他资料 一.项目依赖 1.maven版本:3.5.x 2.pom文件依赖 <!--itext的依赖jar--> < ...

  4. java根据pdf模板生成新的pdf

    文章目录 第一步 制作模板 第二步 引入POM 第三步 根据模板生成PDF 如何填充图片数据 如何让填充的数据进行换行 总结 最近有需求要根据现有的PDF模板生成新的PDF出来,网上资料一大堆,主要总 ...

  5. Aspose.Word企业案例:Lewin Technology 使用 Aspose.PDF for .NET 开发了电子 PDF 文件生成和打印系统

    关于Lewin Technology Lewin Technology 是中国山东省应用创新的主力企业.Lewin Technology 专注于互联网.移动互联网.融合通信等多个产品领域的信息应用系统 ...

  6. python打印pdf文件_Python静默打印PDF到特定的打印机

    我有一个PDF文档,我想用我的 python应用程序打印它. 我使用的方式是使用命令os.startfile('PDFfile.pdf',"print"),但它打开默认查看器(我的 ...

  7. html表格打印成pdf格式文件,使用html2pdf打印PDF格式文件中的数据作为PDF文件

    我想从表单文章中获取一些数据并将其输出到PDF2文件中,并在同一页面上使用html2pdf.但是,当试图将表单数据发布到同一页面时,它不会打开PDF文件,这可能是因为PHP文件的其余部分将出现在if( ...

  8. JAVA利用keytool工具生成.crt和.key文件

    1.生成一个名称为zhanghaiwen的证书 keytool -genkeypair -alias "zhanghaiwen" -keyalg "RSA" - ...

  9. js打印pdf 使用Adobe reader 打印pdf

    最近工作上有需要在js中打印pdf文件,从中遇到了一些问题,到现在已经解决了,做个记录.希望能帮到有需要的人. 我这边主要采用Adobe reader进行加载打印.                   ...

  10. 使用PDF处理控件Aspose.PDF以编程方式打印PDF文档完整攻略

    许多公司在很大程度上减少了纸张的使用.但是,在某些情况下打印很重要.例如,系统可能包含PDF格式的在线订单的详细信息.他们需要在分发在线订单进行交付时打印PDF.他们大规模处理项目,因此手动打印每个文 ...

最新文章

  1. Writing Images to the Excel Sheet using PHPExcel--转载
  2. kl距离 java_信息量、熵、最大熵、联合熵、条件熵、相对熵、互信息。
  3. OpenCV-图像的基本操作-01
  4. 非阻塞I/O多路复用机制
  5. Agglomerative Hierarchical Algorithms(凝聚式层次聚类)
  6. 方法、hadoop源码之JobQueueTaskScheduler-by小雨
  7. 在函数中如何获取 线程对象、线程唯一ID
  8. 如何从计算机中删除 Exchange Server 2003
  9. JavaScript不用临时变量交换两个变量的值的七种解决方案
  10. android 盒子刷机教程,安卓机顶盒刷机 最简单的刷机教程【图文教程】
  11. 计算机体系结构(国防科大)-第四章-指令级并行
  12. 震惊,java8 Nashorn和laytpl居然能擦出这样火花!
  13. linux系统文件颜色所代表的意思
  14. 关于security_huks安全模块的知识总结(一)
  15. 超好用的windows文件资源管理器软件推荐
  16. BMapGL实现地图轨迹运动(地图视角不变)
  17. ChemDraw如何画聚合物,看完就知道了!
  18. 19、网络配线架打线工艺
  19. 【Spark GraphX】社交网图分析
  20. 阿里开源支持10万亿模型的自研分布式训练框架EPL

热门文章

  1. 医学系统(一)医院常用的软件系统:PACS系统、HIS系统、RIS系统、LIS系统、CIS系统
  2. 企业微信加好友太频繁怎么办?
  3. tfidf处理代码_tfidf代码简单实现
  4. Matconvnet测试
  5. MatConvNet对自己的图片分两类及提取图片特征
  6. 解析yml文件 转换 Map
  7. 电机与拖动 - 1 绪论
  8. CAD转KML乱码处理
  9. 罗技 无线鼠标 USB HID数据格式
  10. cad批量等高线lisp_基于AutoCAD Lisp局部等高线自动内插新方法