JAVA生成pdf文件的實(shí)操指南
一、簡(jiǎn)介
PDF文件格式可以將文字、字型、格式、顏色及獨(dú)立于設(shè)備和分辨率的圖形圖像等封裝在一個(gè)文件中。本文實(shí)現(xiàn)將html頁面轉(zhuǎn)PDF。
二、實(shí)操
生成pdf文件成功,但是文字對(duì)不上。當(dāng)修改”GetHtmlContent“部分的編碼之后,再次執(zhí)行生成PDF文件即可完成正確的實(shí)現(xiàn)。

Edit Configurations

三、原理解析
從這幾點(diǎn)深入剖析和總結(jié)這個(gè)小項(xiàng)目:
1.是什么?
該項(xiàng)目實(shí)現(xiàn)了解析一個(gè)模板html文件,將其轉(zhuǎn)為pdf文件并輸出到相應(yīng)的目錄中。
1.1.關(guān)鍵技術(shù)
freemarker,F(xiàn)reeMarker是模板引擎,一個(gè)Java類庫。
itextpdf,iText是一種生成PDF報(bào)表的Java類庫,可以將Xml,Html文件轉(zhuǎn)化為PDF文件。
類 XMLWorkerHelper,(用于解析 XHTML/CSS 或 XML 流到 PDF 的幫助器類)。
2.怎么做?為什么?
相關(guān)依賴
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.2</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.13.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
模板文件:generationpdf.html,所在目錄為src/main/resources/templates/generationpdf.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Title</title>
<style>
body{font-family:SimSun;}
.title{align-content: center;text-align: center;}
.signature{float:right }
</style>
</head>
<body>
<div>
<h1 class="title">標(biāo)題</h1>
<h4 class="title">副標(biāo)題</h4>
<span>當(dāng)前時(shí)間: ${date_time} </span>
<div class="signature">日期:${date}</div>
</div>
</body>
</html>
GetHtmlContent.java:獲取模板內(nèi)容
import freemarker.template.Configuration;
import freemarker.template.Template;
import java.io.*;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
public class GetHtmlContent {
/**
* 獲取模板內(nèi)容
* @param templateDirectory 模板文件夾
* @param templateName 模板文件名
* @param paramMap 模板參數(shù)
* @return
* @throws Exception
*/
public static String getTemplateContent(String templateDirectory, String templateName, Map<String, Object> paramMap) throws Exception {
Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);//不兼容配置
try {
configuration.setDirectoryForTemplateLoading(new File(templateDirectory));//加載模板
} catch (Exception e) {
System.out.println("-- exception --");
}
Writer out = new StringWriter();
Template template = configuration.getTemplate(templateName,"UTF-8");//緩存
template.process(paramMap, out);
out.flush();
out.close();
return out.toString();
}
public static void main(String[] args) throws Exception {
Map<String, Object> paramMap = new HashMap<>();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
paramMap.put("date_time", dateTimeFormatter.format(LocalDateTime.now()));
paramMap.put("date", dateTimeFormatter.format(LocalDateTime.now()).substring(0, 10));
ClassLoader classLoader = GetHtmlContent.class.getClassLoader();
URL resource = classLoader.getResource("templates");
String templateDirectory =resource.toURI().getPath();
String templateContent = GetHtmlContent.getTemplateContent(templateDirectory, "generationpdf.html", paramMap);
System.out.println(templateContent);
}
}
生成pdf文件,將date_time和date存儲(chǔ)到HashMap中,然后將數(shù)據(jù)輸出到pdf中
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.nio.charset.Charset;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
public class GeneratePDF {
/**
* HTML 轉(zhuǎn) PDF
* @param content html內(nèi)容
* @param outPath 輸出pdf路徑
* @return 是否創(chuàng)建成功
*/
public static boolean html2Pdf(String content, String outPath) {
try {
Document document = new Document(); //創(chuàng)建一個(gè)標(biāo)準(zhǔn)的A4紙文檔
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outPath));//書寫器與ducument文檔關(guān)聯(lián)
document.open();//打開文檔
XMLWorkerHelper.getInstance().parseXHtml(writer, document,
new ByteArrayInputStream(content.getBytes()), null, Charset.forName("UTF-8"));
document.close();//關(guān)閉文檔
} catch (Exception e) {
System.out.println("生成模板內(nèi)容失敗"+e.fillInStackTrace());
return false;
}
return true;
}
/**
* HTML 轉(zhuǎn) PDF
* @param content html內(nèi)容
* @return PDF字節(jié)數(shù)組
*/
public static byte[] html2Pdf(String content) {
ByteArrayOutputStream outputStream = null;
try {
Document document = new Document();
outputStream = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
document.open();
XMLWorkerHelper.getInstance().parseXHtml(writer, document,
new ByteArrayInputStream(content.getBytes()), null, Charset.forName("UTF-8"));
document.close();
} catch (Exception e) {
System.out.println("------生成pdf失敗-------");
}
return outputStream.toByteArray();
}
public static void main(String[] args) throws Exception {
Map<String, Object> paramMap = new HashMap<>();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
paramMap.put("date_time", dateTimeFormatter.format(LocalDateTime.now()));
paramMap.put("date", dateTimeFormatter.format(LocalDateTime.now()).substring(0, 10));
String outPath = "D:\\A.pdf";
String templateDirectory = "src/main/resources/templates";
String templateContent = GetHtmlContent.getTemplateContent(templateDirectory, "generationpdf.html", paramMap);
GeneratePDF.html2Pdf(templateContent, outPath);
}
}
3.參考
- java實(shí)現(xiàn)生成PDF文件_xhga的博客-CSDN博客_java pdf
- 什么是 FreeMarker? - FreeMarker 中文官方參考手冊(cè) (foofun.cn)
- iText官方教程_番薯(Koali)的博客-CSDN博客_itext官方文檔
- XMLWorkerHelper (root 5.5.9-SNAPSHOT API) (itextpdf.com)
總結(jié)
到此這篇關(guān)于利用JAVA生成pdf文件的文章就介紹到這了,更多相關(guān)JAVA生成pdf文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java后臺(tái)實(shí)現(xiàn)支付寶支付接口和支付寶訂單查詢接口(前端為APP)
這篇文章主要介紹了java后臺(tái)實(shí)現(xiàn)支付寶支付接口和支付寶訂單查詢接口(前端為APP),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-08-08
Java實(shí)現(xiàn)合并兩個(gè)有序序列算法示例
這篇文章主要介紹了Java實(shí)現(xiàn)合并兩個(gè)有序序列算法,簡(jiǎn)單描述了序列合并算法的原理與java合并有序序列的具體操作步驟及相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-09-09
Springboot升級(jí)到2.7.2結(jié)合nacos遇到的坑及解決
這篇文章主要介紹了Springboot升級(jí)到2.7.2結(jié)合nacos遇到的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Java新手學(xué)習(xí)之IO流的簡(jiǎn)單使用
IO主要用于設(shè)備之間的數(shù)據(jù)傳輸,Java將操作數(shù)據(jù)流的功能封裝到了IO包中,這篇文章主要給大家介紹了關(guān)于Java新手學(xué)習(xí)之IO流簡(jiǎn)單使用的相關(guān)資料,需要的朋友可以參考下2021-10-10
java?Semaphore共享鎖實(shí)現(xiàn)原理解析
這篇文章主要為大家介紹了Semaphore共享鎖實(shí)現(xiàn)原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Java案例使用比較排序器comparator實(shí)現(xiàn)成績(jī)排序
這篇文章主要介紹了Java案例使用比較排序器comparator實(shí)現(xiàn)成績(jī)排序,主要通過案例用TreeSet集合存儲(chǔ)多個(gè)學(xué)生信息,并遍歷該集合,要按照總分從高到低進(jìn)行排序,下文介紹需要的朋友可以參考一下2022-04-04
mybatis Mapper的xml文件中resultType值的使用說明
這篇文章主要介紹了mybatis Mapper的xml文件中resultType值的使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

