99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分享服務(wù)端自定義生成PDF的幾種方案

jf_ro2CN3Fa ? 來源:Java知音 ? 作者:武哥 ? 2022-10-31 11:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

廢話不多說直接進入正題,首先分析生成pdf場景及生成內(nèi)容,考慮復(fù)用性和維護難度是我們當前開發(fā)工作的第一要務(wù)!

下面是調(diào)研的幾個主要方案:

一、itext 表單填充

使用方式:

itext表單填充方案是以pdf作為基礎(chǔ)模板,通過在pdf中嵌入表單元素組件的方式(需要使用pdf編輯工具),最后由程序進行數(shù)據(jù)填充并另存為pdf結(jié)果。

方案優(yōu)缺點:

優(yōu)點:代碼優(yōu)雅,生成后格式變化影響極小。

缺點:原始模板變化需要重新生成pdf,重新編輯表單元素;不支持列表填充數(shù)據(jù)。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

二、freemarker + doc4J 基于Word 生成 PDF

使用方式:

首先將調(diào)整好格式的原始 word 導(dǎo)出為 XML 格式,編輯 XML 模板中需要填充元素的位置,最后由程序處理先由freemarker模板工具替換元素內(nèi)容,再使用doc4J進行pdf導(dǎo)出。

方案優(yōu)缺點:

優(yōu)點:通用性強,基于模板引擎功能強大。

缺點:XML 格式的word真的有夠復(fù)雜,想要在此模板上調(diào)整樣式真的難上加難;由于系統(tǒng)不支持的原因需要導(dǎo)入中文字體庫;doc4J 部分 doc 元素不支持(例如直線),導(dǎo)出格式差異較大。

這可能是由于doc4J迭代問題無法保證新元素的支持,導(dǎo)出結(jié)果比較奔放。。。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

三、freemarker + aspose-words 導(dǎo)出PDF

使用方式:

類似于 freemarker+doc4J 方式,同樣需要編輯XML,導(dǎo)出格式相較doc4J而言有極大提升。

方案優(yōu)缺點:

優(yōu)點:通用性強,基于模板引擎功能強大,無需手工管理字體(macOS),代碼簡單,導(dǎo)出格式與模板基本無差異。

缺點:需要編輯 XML 模板;該方案不是免費版(當然有大神)。

受限于調(diào)試前期需要的修修改改,模板能給人整吐了,所以才有了下一個方案。

四、html + freemarker + itextpdf(html2pdf)

使用方式:

翻譯 word 為 html 頁面(當然就是手寫啦,還原度很重要?。琱tml中模板元素插入(文字填充、列表循環(huán) freemarker 支持的全都能寫),最后由程序處理先由freemarker模板工具替換元素內(nèi)容,再使用html2pdf進行pdf導(dǎo)出。

方案優(yōu)缺點:

優(yōu)點:可維護性相較與上面方案都有極大提升(調(diào)試可見性,動態(tài)替換生效);通用性強,基于模板引擎功能強大;導(dǎo)出格式可控性較強;

缺點:需要中文字體庫。

這個方案是綜合以上多次踩坑的結(jié)果,結(jié)果是顯而易見的。

淺淺來一點代碼,省的大家到處找



com.itextpdf
itextpdf
5.5.13


com.itextpdf
html2pdf
3.0.3


org.xhtmlrenderer
flying-saucer-pdf-itext5
9.0.3


binarta.oss
groovy-template-enginex-freemarker
0.1.3


個人以為自己的代碼會自解釋,就不貼太多注釋了

importcn.hutool.core.io.FileUtil;
importcn.hutool.core.map.MapUtil;
importcom.google.common.collect.Lists;
importcom.itextpdf.text.pdf.BaseFont;
importfreemarker.cache.ByteArrayTemplateLoader;
importfreemarker.template.Configuration;
importfreemarker.template.Template;
importlombok.SneakyThrows;
importorg.xhtmlrenderer.pdf.ITextFontResolver;
importorg.xhtmlrenderer.pdf.ITextRenderer;

importjava.io.BufferedWriter;
importjava.io.ByteArrayOutputStream;
importjava.io.File;
importjava.io.StringWriter;
importjava.nio.charset.Charset;
importjava.nio.charset.StandardCharsets;
importjava.util.List;
importjava.util.Locale;
importjava.util.Map;
importjava.util.Objects;
importjava.util.function.Supplier;

publicclassHtmlToPdfUtil{

privatestaticfinalByteArrayTemplateLoaderTEMPLATE_LOADER=newByteArrayTemplateLoader();

//導(dǎo)入需要字體庫的位置哦;simsun 為宋體
publicstaticfinalStringFRONT_PATH="/usr/share/fonts/simsun.ttc";

/**
*看明白的話只用這個方法就夠
*/
publicstaticByteArrayOutputStreamhtmlToPdf(StringtemplateName,SupplierloadTemplateSupplier,MapmodeViewMap){

Stringhtml=xmlFormat(templateName,loadTemplateSupplier,modeViewMap);

returnhtmlToPdf(html);
}

@SneakyThrows
publicstaticByteArrayOutputStreamhtmlToPdf(StringhtmlStr){
ByteArrayOutputStreamoutputStream=newByteArrayOutputStream();
ITextRendererrenderer=newITextRenderer();
renderer.setDocumentFromString(htmlStr);
ITextFontResolverresolver=renderer.getFontResolver();
//添加字體,解決中文不顯示的問題
resolver.addFont(FRONT_PATH,BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
renderer.layout();
renderer.createPDF(outputStream);
returnoutputStream;
}


publicstaticStringxmlFormat(StringtemplateName,SupplierloadTemplateSupplier,MapmodeViewMap){
if(Objects.isNull(TEMPLATE_LOADER.findTemplateSource(templateName))){
synchronized(TEMPLATE_LOADER){
if(Objects.isNull(TEMPLATE_LOADER.findTemplateSource(templateName))){
TEMPLATE_LOADER.putTemplate(templateName,loadTemplateSupplier.get());
}
}
}
returnxmlFormat(templateName,modeViewMap);
}

@SneakyThrows
publicstaticStringxmlFormat(StringtemplateName,MapmodeViewMap){
Configurationcfg=newConfiguration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
//指定FreeMarker模板文件的位置
cfg.setTemplateLoader(TEMPLATE_LOADER);
//設(shè)置模板的編碼格式
cfg.setEncoding(Locale.CHINA,Charset.defaultCharset().name());
//獲取模板文件template
Templatetemplate=cfg.getTemplate(templateName,Charset.defaultCharset().name());
StringWriterstringWriter=newStringWriter();

BufferedWriterwriter=newBufferedWriter(stringWriter);
template.process(modeViewMap,writer);
returnstringWriter.toString();
}

}

結(jié)

解決這個問題的核心思路方案其實一直沒變,變化的只是工具,一定要思路清晰!





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • XML
    XML
    +關(guān)注

    關(guān)注

    0

    文章

    188

    瀏覽量

    33753
  • HTML
    +關(guān)注

    關(guān)注

    0

    文章

    280

    瀏覽量

    42658

原文標題:服務(wù)端自定義生成PDF的幾種方案

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    大彩講堂:VisualTFT軟件如何自定義圓形進度條

    VisualTFT軟件如何自定義圓形進度條
    的頭像 發(fā)表于 07-07 17:10 ?509次閱讀
    大彩講堂:VisualTFT軟件如何<b class='flag-5'>自定義</b>圓形進度條

    KiCad 中的自定義規(guī)則(KiCon 演講)

    “ ?Seth Hillbrand 在 KiCon US 2025 上為大家介紹了 KiCad 的規(guī)則系統(tǒng),并詳細講解了自定義規(guī)則的設(shè)計與實例。? ” ? 演講主要圍繞 加強 KiCad 中的自定義
    的頭像 發(fā)表于 06-16 11:17 ?612次閱讀
    KiCad 中的<b class='flag-5'>自定義</b>規(guī)則(KiCon 演講)

    HarmonyOS應(yīng)用自定義鍵盤解決方案

    自定義鍵盤是一種替換系統(tǒng)默認鍵盤的解決方案,可實現(xiàn)鍵盤個性化交互。允許用戶結(jié)合業(yè)務(wù)需求與操作習慣,對按鍵布局進行可視化重構(gòu)、設(shè)置多功能組合鍵位,使輸入更加便捷和舒適。在安全防護層面,自定義鍵盤可以
    的頭像 發(fā)表于 06-05 14:19 ?690次閱讀

    LabVIEW運動控制(三):EtherCAT運動控制器的高效加工指令自定義封裝

    LabVIEW高效加工指令自定義封裝
    的頭像 發(fā)表于 04-08 13:49 ?2696次閱讀
    LabVIEW運動控制(三):EtherCAT運動控制器的高效加工指令<b class='flag-5'>自定義</b>封裝

    如何添加自定義單板

    在開發(fā)過程中,用戶有時需要創(chuàng)建自定義板配置。本節(jié)將通過一個實例講解用戶如何創(chuàng)建屬于自己的machine,下面以g2l-test.conf為例進行說明。
    的頭像 發(fā)表于 03-12 14:43 ?590次閱讀

    如何快速創(chuàng)建用戶自定義Board和App工程

    概述自HPM_SDKv1.7.0發(fā)布開始,在HPM_ENV中新增了user_template文件夾,以方便用戶快速創(chuàng)建自定義的Board和App工程。user_template是用戶模板工程,用戶
    的頭像 發(fā)表于 02-08 13:38 ?524次閱讀
    如何快速創(chuàng)建用戶<b class='flag-5'>自定義</b>Board和App工程

    Altium Designer 15.0自定義元件設(shè)計

    電子發(fā)燒友網(wǎng)站提供《Altium Designer 15.0自定義元件設(shè)計.pdf》資料免費下載
    發(fā)表于 01-21 15:04 ?0次下載
    Altium Designer 15.0<b class='flag-5'>自定義</b>元件設(shè)計

    think-cell:自定義think-cell(四)

    C.5 設(shè)置默認議程幻燈片布局 think-cell 議程可以在演示文稿中使用特定的自定義布局來定義議程、位置和議程幻燈片上的其他形狀,例如標題或圖片。通過將此自定義布局添加到模板,您可以為整個組織
    的頭像 發(fā)表于 01-13 10:37 ?512次閱讀
    think-cell:<b class='flag-5'>自定義</b>think-cell(四)

    智能語音識別照明解決方案,平臺自定義,中英切換

    智能語音識別照明方案引入NRK3502芯片,支持平臺自定義,離線控制,中英雙語切換。NRK3502具備高性能和靈活自定義能力,可推動智能照明革新,控制其他智能設(shè)備,為國際用戶提供全方位智能生活體驗。
    的頭像 發(fā)表于 01-10 13:23 ?434次閱讀
    智能語音識別照明解決<b class='flag-5'>方案</b>,平臺<b class='flag-5'>自定義</b>,中英切換

    think-cell;自定義think-cell(一)

    布局介紹了如何創(chuàng)建自定義議程幻燈片布局,第六部分 C.6 功能區(qū)自定義 介紹了如何使用 PowerPoint 的功能區(qū)自定義選項自定義 think-cell 的用戶界面。 可以使用樣式
    的頭像 發(fā)表于 01-08 11:31 ?744次閱讀
    think-cell;<b class='flag-5'>自定義</b>think-cell(一)

    TPS659xx應(yīng)用程序自定義工具

    電子發(fā)燒友網(wǎng)站提供《TPS659xx應(yīng)用程序自定義工具.pdf》資料免費下載
    發(fā)表于 11-06 10:02 ?0次下載
    TPS659xx應(yīng)用程序<b class='flag-5'>自定義</b>工具

    美國硅谷高防服務(wù)自定義解析

      隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,數(shù)據(jù)安全成為了企業(yè)和個人關(guān)注的重點。美國硅谷作為全球科技創(chuàng)新的中心之一,其高防服務(wù)器技術(shù)也在不斷發(fā)展,為企業(yè)和個人提供更加安全可靠的網(wǎng)絡(luò)環(huán)境。本文將介紹什么是高防服務(wù)器及其自定義選項的重要性。
    的頭像 發(fā)表于 09-27 10:10 ?324次閱讀

    創(chuàng)建自定義的基于閃存的引導(dǎo)加載程序(BSL)

    電子發(fā)燒友網(wǎng)站提供《創(chuàng)建自定義的基于閃存的引導(dǎo)加載程序(BSL).pdf》資料免費下載
    發(fā)表于 09-19 10:50 ?0次下載
    創(chuàng)建<b class='flag-5'>自定義</b>的基于閃存的引導(dǎo)加載程序(BSL)

    NVIDIA NeMo加速并簡化自定義模型開發(fā)

    如果企業(yè)希望充分發(fā)揮出 AI 的力量,就需要根據(jù)其行業(yè)需求量身定制的自定義模型。
    的頭像 發(fā)表于 07-26 11:17 ?1260次閱讀
    NVIDIA NeMo加速并簡化<b class='flag-5'>自定義</b>模型開發(fā)

    NVIDIA AI Foundry 為全球企業(yè)打造自定義 Llama 3.1 生成式 AI 模型

    Foundry 提供從數(shù)據(jù)策管、合成數(shù)據(jù)生成、微調(diào)、檢索、防護到評估的全方位生成式 AI 模型服務(wù),以便部署自定義 Llama 3.1 NVIDIA NIM 微
    發(fā)表于 07-24 09:39 ?919次閱讀
    NVIDIA AI Foundry 為全球企業(yè)打造<b class='flag-5'>自定義</b> Llama 3.1 <b class='flag-5'>生成</b>式 AI 模型