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

SpringBoot3集成iText實(shí)現(xiàn)PDF導(dǎo)出功能

 更新時(shí)間:2024年10月09日 10:35:15   作者:江南一點(diǎn)雨  
不知道小伙伴們在項(xiàng)目中有沒有遇到過導(dǎo)出 PDF 的需求,小編在之前的 tienchin 項(xiàng)目中有一個(gè)合同導(dǎo)出的功能,需要將文檔導(dǎo)出為PDF,將文檔導(dǎo)出為 PDF 有很多方案,不同方案的優(yōu)缺點(diǎn)也各不相同,今天小編就和大家演示一個(gè),感興趣的小伙伴跟著小編一起來看看吧

一 解決方案

以下是小編列舉的一些常見的 PDF 導(dǎo)出方案。

1.1 iText

iText 是一個(gè)強(qiáng)大的 PDF 處理庫,可以用來創(chuàng)建和操作 PDF 文件。在 Spring Boot 項(xiàng)目中,你可以通過添加 iText 的依賴來使用它。iText 支持直接創(chuàng)建 PDF,也可以將 HTML 內(nèi)容轉(zhuǎn)換為 PDF。

iText 的特點(diǎn)如下:

優(yōu)點(diǎn):

  • 功能強(qiáng)大,支持創(chuàng)建和編輯 PDF 文件。
  • 提供豐富的 API,支持添加圖像、水印、表格、書簽和超鏈接等。
  • 支持?jǐn)?shù)字簽名和加密 PDF 文件。
  • 性能優(yōu)秀,能夠高效地處理大型 PDF 文件和復(fù)雜操作。

缺點(diǎn):

  • 學(xué)習(xí)曲線較陡峭,需要一定的時(shí)間和精力去熟悉。
  • 商業(yè)版需要購買許可證,可能會(huì)增加成本。
  • 對于簡單的 PDF 處理任務(wù)可能過于復(fù)雜。

1.2 OpenPDF

OpenPDF 是基于 iText5.x 版本開發(fā)的,它提供了將 HTML 轉(zhuǎn)換為 PDF 的功能。

OpenPDF 的特點(diǎn)如下:

優(yōu)點(diǎn):

  • 簡單易用,適合快速開發(fā)。
  • 提供了創(chuàng)建和操作 PDF 文件的一組 API。

缺點(diǎn):

功能相對較少,可能無法滿足復(fù)雜需求。

1.3 Apache PDFBox

Apache PDFBox 是一個(gè)開源的 Java PDF 庫,可以用來創(chuàng)建和編輯 PDF 文檔。它提供了豐富的 API 來操作 PDF 內(nèi)容。

Apache PDFBox 的特點(diǎn)如下:

優(yōu)點(diǎn):

  • 功能齊全,支持創(chuàng)建、編輯、提取內(nèi)容等操作。
  • 支持 OCR 識別和打印等功能。
  • 性能穩(wěn)定,適合全面處理 PDF 文件的場景。
  • 開源免費(fèi),采用 Apache 許可證。

缺點(diǎn):

  • 相對于 iText,處理大型文件時(shí)性能可能略遜一籌。
  • API 設(shè)計(jì)較為復(fù)雜,可能會(huì)影響開發(fā)效率。

1.4 Flyingsaucer

Flyingsaucer 是一個(gè)基于 iText 和 XHTMLRenderer 的 Java 庫,可以將 XHTML/CSS 內(nèi)容轉(zhuǎn)換為 PDF。

Flyingsaucer 特點(diǎn)如下:

優(yōu)點(diǎn):

  • 可以將 HTML/CSS 內(nèi)容直接轉(zhuǎn)換為 PDF。
  • 支持使用 CSS 樣式來控制 PDF 的外觀。

缺點(diǎn):

  • 不支持富文本,對于使用富文本編輯器的內(nèi)容處理不佳。
  • 對 HTML 的規(guī)范性要求較高,容錯(cuò)性較差。

上面是小編給大家列舉的幾個(gè)常見的方案,實(shí)際方案除了這些還有很多,比如 WeasyPrint、OpenHTMLtoPDF 等,在實(shí)際項(xiàng)目中選擇哪種方案取決于你的具體需求,比如是否需要處理復(fù)雜的布局、是否需要支持 CSS 樣式、是否需要處理中文等非 ASCII 字符等。每種方案都有其優(yōu)缺點(diǎn),需要根據(jù)項(xiàng)目實(shí)際情況進(jìn)行選擇。

小編這里和小伙伴們演示一下 iText 的使用,這個(gè)工具的能力最為強(qiáng)大。

二 iText

2.1 什么是 iText

iText 是一個(gè)功能強(qiáng)大的開源 Java 庫,用于創(chuàng)建和操作 PDF 文件。

iText 提供了豐富的 API,可以生成交互式 PDF 文檔、添加書簽、頁碼、水印,以及拆分和合并 PDF 文檔等。

iText 支持將 PDF 保存為圖像文件,如 PNG 或 JPEG,并且可以在 PDF 文檔上繪制各種幾何形狀,如圓形、線條等。

iText的主要特點(diǎn)

  • 交互性:可以創(chuàng)建交互式 PDF 文檔,如表單填寫。
  • 添加元素:可以添加書簽、頁碼、水印等。
  • 分割與合并:可以將現(xiàn)有 PDF 分割或合并其他頁面。
  • 表單處理:可以處理 PDF 表單。
  • 保存為圖像:可以將 PDF 保存為圖像格式。
  • 繪制功能:提供 Canvas 類,支持繪制各種形狀。

注意,iText 本身不支持中文,需要引入中文字體文件,并使用 BaseFont.createFont 方法創(chuàng)建字體對象,然后使用該字體對象創(chuàng)建文本。

在使用 iText 時(shí),還需要注意開源協(xié)議的問題。iText 目前遵循 AGPL 開源協(xié)議,如果是商業(yè)用途,需要公開源代碼或者購買商業(yè)許可。

此外,iText 還提供了一些高級功能,如 PDF 加密、數(shù)字簽名、優(yōu)化 PDF 文件大小等。

2.2 案例

首先我們新建一個(gè) Spring Boot 項(xiàng)目,引入 Thymeleaf 依賴,引入這個(gè)依賴的原因在于我們一會(huì)利用 Thymeleaf 做頁面模版,然后利用 iText 做 PDF 生成。

項(xiàng)目創(chuàng)建成功之后,再引入 iText 的依賴,最終依賴如下:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation group: 'com.itextpdf', name: 'itextpdf', version: '5.5.13.4'
    implementation group: 'com.itextpdf', name: 'html2pdf', version: '5.0.5'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

注意,這里和 iText 相關(guān)的依賴一共有兩個(gè)。

接下來我們創(chuàng)建一個(gè) HTML 頁面作為生成的 PDF 模版,這個(gè)模版我們就放到 Thymeleaf 默認(rèn)的 templates 目錄下:

<!DOCTYPE html>
<h1 th:text="${title}"></h1>
<table border="1">
    <tr>
        <td>圖書名稱</td>
        <td th:text="${name}"></td>
    </tr>
    <tr>
        <td>圖書價(jià)格</td>
        <td th:text="${price}"></td>
    </tr>
    <tr>
        <td>圖書作者</td>
        <td th:text="${author}"></td>
    </tr>
</table>

這個(gè)頁面模版使用 Thymeleaf 來構(gòu)建。

另外,由于這些工具大部分都不直接支持中文,需要我們提前準(zhǔn)備中文字體,松哥這里準(zhǔn)備了一個(gè)宋體字庫,放在 resources/fonts 目錄下:

接下來我們就準(zhǔn)備一個(gè)生成 PDF 的工具類,如下:

package org.javaboy.openpdfdemo.utils;

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.font.FontProvider;

import java.io.IOException;
import java.io.OutputStream;


public class HtmlToPdfUtils {

    public static void convertToPdf(String html, OutputStream outputStream) throws IOException {

        PdfWriter pdfWriter = new PdfWriter(outputStream);
        PdfDocument pdfDocument = new PdfDocument(pdfWriter);
        // 設(shè)置為A4大小
        pdfDocument.setDefaultPageSize(PageSize.A4);

        // 添加中文字體支持
        ConverterProperties properties = new ConverterProperties();
        FontProvider fontProvider = new FontProvider();

        // 添加自定義字體,例如宋體
        PdfFont stSong = PdfFontFactory.createFont(HtmlToPdfUtils.class.getResource("/fonts/STSong.ttf").getPath(), PdfEncodings.WINANSI);
        fontProvider.addFont(stSong.getFontProgram(), PdfEncodings.IDENTITY_H);

        properties.setFontProvider(fontProvider);
        if (html != null) {
            // 生成pdf文檔
            HtmlConverter.convertToPdf(html, pdfDocument, properties);
            pdfWriter.close();
            pdfDocument.close();
        } else {
            throw new RuntimeException("HTML 內(nèi)容不能為空");
        }
    }
}

這塊代碼沒啥好說的,基本上見名知義。

最后,在 Controller 接口中調(diào)用該工具類,如下:

package org.javaboy.openpdfdemo.controller;

import com.itextpdf.text.DocumentException;
import jakarta.servlet.http.HttpServletResponse;
import org.javaboy.openpdfdemo.utils.HtmlToPdfUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.IOException;

@RestController
public class HelloController {

    @Autowired
    TemplateEngine templateEngine;

    @GetMapping("/getBookInfo")
    public void getBookInfo(HttpServletResponse response) throws IOException, DocumentException {
        Context ctx = new Context();
        ctx.setVariable("title","<深入淺出 Spring Security>圖書詳情");
        ctx.setVariable("name","<深入淺出 Spring Security>");
        ctx.setVariable("price","99.00");
        ctx.setVariable("author","江南一點(diǎn)雨");
        String bookInfo = templateEngine.process("book_info", ctx);
        response.setContentType("application/pdf;charset=utf-8");
        HtmlToPdfUtils.convertToPdf(bookInfo, response.getOutputStream());
    }
}

先利用 TemplateEngine,將頁面模版的內(nèi)容轉(zhuǎn)為渲染后的 HTML 字符串,然后調(diào)用工具方法去生成 PDF,生成的 PDF 直接就賦值給請求響應(yīng)的輸出流。

最后,我們在瀏覽器中訪問 http://localhost:8080/getBookInfo 就可以查看生成的 PDF 內(nèi)容啦~

好啦,一個(gè)簡單的案例,帶小伙伴們感受下 Java 生成 PDF。

以上就是SpringBoot3集成iText實(shí)現(xiàn)PDF導(dǎo)出功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot3 iText實(shí)現(xiàn)PDF導(dǎo)出的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JAVA基礎(chǔ)之基本數(shù)據(jù)類型全面解析

    JAVA基礎(chǔ)之基本數(shù)據(jù)類型全面解析

    下面小編就為大家?guī)硪黄狫AVA基礎(chǔ)之基本數(shù)據(jù)類型全面解析。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • SpringBoot詳解如果通過@Value注解給靜態(tài)變量注入值

    SpringBoot詳解如果通過@Value注解給靜態(tài)變量注入值

    這篇文章主要介紹了springboot如何通過@Value給靜態(tài)變量注入值,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java之BigDecimal實(shí)現(xiàn)詳解

    Java之BigDecimal實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java之BigDecimal實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • SpringDataJpa:JpaRepository增刪改查操作

    SpringDataJpa:JpaRepository增刪改查操作

    這篇文章主要介紹了SpringDataJpa:JpaRepository增刪改查操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java虛擬機(jī)原理:Class字節(jié)碼二進(jìn)制文件分析

    java虛擬機(jī)原理:Class字節(jié)碼二進(jìn)制文件分析

    class文件全名稱為Java class文件,主要在平臺無關(guān)性和網(wǎng)絡(luò)移動(dòng)性方面使Java更適合網(wǎng)絡(luò)。它在平臺無關(guān)性方面的任務(wù)是:為Java程序提供獨(dú)立于底層主機(jī)平臺的二進(jìn)制形式的服務(wù)。下面我們來詳細(xì)解讀下它吧
    2021-09-09
  • MyBatis-Plus實(shí)現(xiàn)對查詢結(jié)果進(jìn)行分頁的基本步驟

    MyBatis-Plus實(shí)現(xiàn)對查詢結(jié)果進(jìn)行分頁的基本步驟

    MyBatis-Plus 是一個(gè) MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,MyBatis-Plus 支持多種數(shù)據(jù)庫的分頁查詢,其分頁功能是通過 Page 類實(shí)現(xiàn)的,本文介紹了使用 MyBatis-Plus 實(shí)現(xiàn)分頁查詢的基本步驟,需要的朋友可以參考下
    2024-08-08
  • mybatisX插件的使用及打包成配置

    mybatisX插件的使用及打包成配置

    本文主要介紹了mybatisX插件的使用及打包成配置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • Java實(shí)現(xiàn)雪花算法的原理和實(shí)戰(zhàn)教程

    Java實(shí)現(xiàn)雪花算法的原理和實(shí)戰(zhàn)教程

    這篇文章主要介紹了Java實(shí)現(xiàn)雪花算法的原理和實(shí)戰(zhàn)教程,本文通過語言表述和代碼的實(shí)現(xiàn)講解了該項(xiàng)算法,,需要的朋友可以參考下
    2021-06-06
  • SpringBoot Application的exclude不生效問題及排查

    SpringBoot Application的exclude不生效問題及排查

    這篇文章主要介紹了SpringBoot Application的exclude不生效問題及排查,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • jvm類加載器基礎(chǔ)解析

    jvm類加載器基礎(chǔ)解析

    這篇文章主要介紹了jvm類加載器基礎(chǔ)解析,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12

最新評論

留坝县| 内江市| 阳东县| 巴林右旗| 三河市| 长子县| 夏河县| 闸北区| 凤台县| 华阴市| 拉孜县| 筠连县| 淮阳县| 河津市| 江川县| 宾川县| 宣恩县| 藁城市| 新泰市| 浪卡子县| 剑阁县| 靖边县| 阜阳市| 郎溪县| 上饶市| 荣昌县| 乐都县| 西畴县| 兴业县| 田阳县| 乌拉特后旗| 桦南县| 南陵县| 彭泽县| 墨江| 长岭县| 且末县| 吉木乃县| 汽车| 濮阳市| 望江县|