java生成pdf_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調用打印機進行打印文件
之前寫過一篇,多種方式,有興趣的可以看看。[點擊這里查看](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的一個工具類,代碼注釋寫的比較詳細,直接看就行
**主要講一下需要注意的地方:**

文件字體:必須有字體文件
```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()
```
##### 如何生成模板并填充數據
舉個例子
比如生成這個樣子:

```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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python参数顺序 元组 字典_pyt
- 下一篇: java和javaweb的区别_java