日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2023/12/18 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java生成pdf_Java实现PDF文件生成并且打印pdf文件 demo 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

## 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。