最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA生成pdf文件的實(shí)操教程

 更新時(shí)間:2022年11月12日 10:00:05   作者:瘋狂java杰尼龜  
PDF是可移植文檔格式,是一種電子文件格式,具有許多其他電子文檔格式無(wú)法相比的優(yōu)點(diǎn),下面這篇文章主要給大家介紹了關(guān)于JAVA生成pdf文件的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下

一、簡(jiǎn)介

PDF文件格式可以將文字、字型、格式、顏色及獨(dú)立于設(shè)備和分辨率的圖形圖像等封裝在一個(gè)文件中。本文實(shí)現(xiàn)將html頁(yè)面轉(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類庫(kù)。
itextpdf,iText是一種生成PDF報(bào)表的Java類庫(kù),可以將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();//打開(kāi)文檔
            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.參考

總結(jié) 

到此這篇關(guān)于JAVA生成pdf文件的文章就介紹到這了,更多相關(guān)JAVA生成pdf文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)一個(gè)達(dá)達(dá)租車系統(tǒng)的步驟詳解

    Java實(shí)現(xiàn)一個(gè)達(dá)達(dá)租車系統(tǒng)的步驟詳解

    這篇文章主要給大家介紹了利用Java實(shí)現(xiàn)一個(gè)達(dá)達(dá)租車系統(tǒng)的步驟,文中給出了詳細(xì)的實(shí)現(xiàn)思路和示例代碼,并在文末給出了完整的源碼供大家學(xué)習(xí)下載,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-04-04
  • Springboot配置圖片虛擬映射示例代碼

    Springboot配置圖片虛擬映射示例代碼

    這篇文章主要給大家介紹了關(guān)于Springboot配置圖片虛擬映射的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用springboot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-11-11
  • java序列化和java反序列化示例

    java序列化和java反序列化示例

    在web項(xiàng)目開(kāi)發(fā)的時(shí)候,經(jīng)常用到序列化和反序列化用來(lái)傳遞大流量的數(shù)據(jù),類只有實(shí)現(xiàn)Serializable借口才能被序列化,下來(lái)是java序列化和反序列化演示
    2014-01-01
  • Java的Semaphore信號(hào)量使用及原理解析

    Java的Semaphore信號(hào)量使用及原理解析

    這篇文章主要介紹了Java的Semaphore信號(hào)量使用及原理解析,Semaphore 通常我們叫它信號(hào)量, 可以用來(lái)控制同時(shí)訪問(wèn)特定資源的線程數(shù)量,通過(guò)協(xié)調(diào)各個(gè)線程,以保證合理的使用資源,需要的朋友可以參考下
    2023-12-12
  • Java基于UDP協(xié)議的聊天室功能

    Java基于UDP協(xié)議的聊天室功能

    這篇文章主要為大家詳細(xì)介紹了Java基于UDP協(xié)議的聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 若依框架多數(shù)據(jù)源切換方式

    若依框架多數(shù)據(jù)源切換方式

    這篇文章主要介紹了若依框架多數(shù)據(jù)源切換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 源碼閱讀之storm操作zookeeper-cluster.clj

    源碼閱讀之storm操作zookeeper-cluster.clj

    這篇文章主要介紹了源碼閱讀之storm操作zookeeper-cluster.clj的相關(guān)內(nèi)容,對(duì)其源碼進(jìn)行了簡(jiǎn)要分析,具有參考意義,需要的朋友可以了解下。
    2017-10-10
  • SpringBoot集成XXL-JOB實(shí)現(xiàn)靈活控制的分片處理方案

    SpringBoot集成XXL-JOB實(shí)現(xiàn)靈活控制的分片處理方案

    因?yàn)樾枰⑿刑幚硗粡垟?shù)據(jù)表里的數(shù)據(jù),所以比較自然地想到了分片查詢數(shù)據(jù),可以利用對(duì) id 取模的方法進(jìn)行分片,避免同一條數(shù)據(jù)被重復(fù)處理,所以本文給大家介紹了SpringBoot集成XXL-JOB實(shí)現(xiàn)靈活控制的分片處理方案,需要的朋友可以參考下
    2024-09-09
  • 關(guān)于Java項(xiàng)目讀取resources資源文件路徑的那點(diǎn)事

    關(guān)于Java項(xiàng)目讀取resources資源文件路徑的那點(diǎn)事

    這篇文章主要介紹了關(guān)于Java項(xiàng)目讀取resources資源文件路徑的那點(diǎn)事,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 淺談spring中scope作用域

    淺談spring中scope作用域

    這篇文章主要介紹了淺談spring中scope作用域,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12

最新評(píng)論

英吉沙县| 白玉县| 建湖县| 宣武区| 吉安市| 平原县| 萝北县| 龙海市| 武汉市| 恩施市| 英山县| 定日县| 松潘县| 广元市| 吴川市| 同江市| 宣化县| 台南县| 甘泉县| 纳雍县| 阳朔县| 兰考县| 新沂市| 静海县| 宁蒗| 沙坪坝区| 石景山区| 乡城县| 平湖市| 湖州市| 博白县| 高邑县| 邵东县| 阳原县| 太和县| 米林县| 临海市| 临清市| 曲松县| 区。| 云浮市|