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

#### 目录:

0. 效果预览

1. 准备环境

2. Java如何调用打印机进行打印

3. Java如何生成pdf打印文件

4. 实现pdf内数据动态填充(可按需求改变数据,有一个模板就行)

##### 效果预览:

- 说明:以下是根据不同用户数据和自己生成的pdf模板,动态生成的pdf文件,可直接调用打印机打印。

- 数据可从数据库动态获取并且填充

![在这里插入图片描述](https://img-blog.csdnimg.cn/201909282000077.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0phdmFCdWlsdA==,size_16,color_FFFFFF,t_70)

##### 环境准备:

1. java标准开发环境

2. 打印机一台(确保已和设备连接),测试的时候要用,开发没有打印机也行

3. 相关jar包

- pdfbox

- itextpdf

- commons-logging.jar

##### 实现Java调用打印机进行打印文件

之前写过一篇,多种方式,有兴趣的可以看看。[点击这里查看](https://blog.csdn.net/JavaBuilt/article/details/81322086)

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

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

```java

/**

* 打印实现类

* 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文件

这个比较复杂,涉及到单元格,表,段落,标题等内容

慢慢来,一步一步讲解一下

```java

/**

* 生成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的一个工具类,代码注释写的比较详细,直接看就行

**主要讲一下需要注意的地方:**

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190928210452331.png)

文件字体:必须有字体文件

```java

// 系统字体文件在 Windows/Fonts目录下,将其粘到src下即可

public static final String CHARACTOR_FONT_CH_FILE = "/SIMSUN.TTC,1"; //宋体 常规

```

纸张尺寸:设置A4,有别的需求可自行设置

```java

// 纸张尺寸

public static final Rectangle PAGE_SIZE = PageSize.A4;

```

上下左右边距:就是文件内容距离上下左右四条边的距离,可自行根据需求设置

```java

// 边距

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对象,并向里写数据

```java

void createDocument()

```

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

```java

void closeDocument()

```

##### 如何生成模板并填充数据

举个例子

比如生成这个样子:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190928204118305.png)

```java

private void writeVA(Chapter chapter) {

// -------------------------这里开始 到下面写你自己的数据对象解析逻辑 --------

VisualAcuity[] vaArr = {leftPreVA,leftSufVA,rightPreVA,rightSufVA,doublePreVA,doubleSufVA} ;

initVA(); // 实例化对象

ListvaList = 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_Java实现PDF文件生成并且打印pdf文件 demo相关推荐

  1. java按模板生成pdf_java中根据模板生成pdf文件

    简介 本文使用java引入apache提供的pdf操作工具生成pdf文件,主要是根据需求开发了一个util类,记录一下学习和开发过程. 业务需求 因为业务需要,对于不同的用户要生成一个不同的pdf文件 ...

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

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

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

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

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

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

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

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

  6. 利用Aspose.PDF以编程方式打印PDF文档

    使用C#打印PDF文件 可以使用C#或VB.net在.NET应用程序中自动打印PDF文件.您可以按照以下简单步骤打印PDF文件: 创建一个PdfViewer类的对象 加载输入的PDF文档 打印PDF文 ...

  7. java osgi pdf_java – XDocReport使用OSGI将ODT转换为PDF

    要开始使用XDocReport,我想将ODT转换为PDF. 我的所有应用程序都是OSGi.所以我安装了以下软件包: fr.opensagres.xdocreport.converter-1.0.5.j ...

  8. 书法字帖 PDF转化为可打印PDF

    书法类的PDF,因为底色是黑色的,打印起来特别费墨,所以需要转化成白底黑字的文件, 才好打印. 1)用 pdfbox 的 ExtractImages 命令,抽出所有的图片 https://pdfbox ...

  9. 还在为打印PDF文件发愁?文档开发工具Spire.PDF 6种方式帮你搞定!

    Spire.PDF(点击下载)是一个专业的PDF组件,能够独立地创建.编写.编辑.操作和阅读PDF文件,支持 .NET.Java.WPF和Silverlight.Spire.PDF的PDF API拥有 ...

  10. C# 打印PDF文档的10种方法

    操作PDF文档时,打印是常见的需求之一.针对不同的打印需求,可分多种情况来进行,如设置静默打印.指定打印页码范围和打印纸张大小.双面打印.黑白打印等等.经过测试,下面将对常见的几种PDF打印需求做一些 ...

最新文章

  1. 程序员转正述职报告_程序员转正述职报告范文
  2. XSS跨站脚本(web应用)——XSS相关工具及使用(四)
  3. 公司网络故障那些事(路由器变交换机)
  4. 【Maccmsv10 站群深度定制版 开发日志】核心功能:紧急优化模块
  5. 网络时间同步系统(NTP授时服务器)在电信网络的技术性应用研究
  6. stream rabbit
  7. mysql SQL语句分析工具_MySQL 数据库中SQL语句执行分析优化工具Explain使用说明 | IT工程师的生活足迹...
  8. 开源练习linux网络编程,如何学习Linux网络编程
  9. 解构领域驱动设计--思维导图
  10. 游戏测试的概念是什么?测试方法和流程有哪些?
  11. Ddos攻击怎么防护?DDOS八大防御策略
  12. php批量邮件地址,PHP通过phpmailer批量发送邮件功能
  13. 51单片机蜂鸣器实验
  14. Win10查看电脑的开机时间和关机时间记录
  15. 2022年1月国产数据库排行榜:TiDB霸榜两年势头不减,openGauss与OceanBase分数大涨
  16. PG数据库:分组后取每组第一条数据
  17. 绘图计算机配置清单,主攻专业设计制图 5000元以下i5-7500独显电脑配置清单推荐...
  18. 夯实基础——P1830 轰炸III
  19. 学习日记20160915
  20. 【数据堂开放数据】活体检测数据免费开放

热门文章

  1. html用css画多边形,Sass绘制多边形_Preprocessor, Sass, SCSS, clip-path, CSS处理器, 会员专栏 教程_W3cplus...
  2. 哈罗单车怎么关锁还车_好象被哈罗单车套路了,提醒大家小心
  3. GB2312 UTF8 UCS2汉字编码对应表
  4. electron 屏幕标注_屏幕 | screen (screen) – Electron 中文开发手册
  5. 翻到几年前的代码,我惊了。
  6. android复选框不选中无法点击按钮,Android-Listveiw的checkbox,Button焦点问题
  7. 链接不到服务器_新手搭建云服务器详细过程
  8. ots在线考计算机的word,ots在线考试系统1(OTS online examination system 1).doc
  9. 贝叶斯分类器_python机器学习API介绍10:多项式贝叶斯分类器
  10. python的类作用_python——类中的self到底的作用及三个应用场景