前言:

该demo使用springboot框架通过fop使用xslt模板将xml数据转换成pdf文件,解决了 生成的 pdf 文件内容中文变成 # 或是 繁体乱码 问题;

底层原理小编也没有去研究了,因为公司项目用到该功能,匆匆忙学了咋使用,特意记录一下方便下次使用,希望对大家也有所帮助。

目录

前言:

1.准备:

1.1下载需要的fop配置文件:fop-2.7-bin

1.2准备字体文件

1.3添加依赖

2.编写xml数据文件

3.编写xslt模板文件

4.修改fop配置文件

5.main方法


1.准备:

1.1下载需要的fop配置文件:fop-2.7-bin

1.2准备字体文件

simkai.ttf 和 simkai.xml

simkai.ttf文件系统自带:C:\\Windows\\Fonts\\simkai.ttf

simkai.xml文件可以通过 simkai.ttf生成: 对应的xml最好是通过ttf自己去生成,下载的可能会有问题。

 public static void main(String args[]){String[] parameters = {"-ttcname","simkai","C:\\Windows\\Fonts\\simkai.ttf", "E:\\test\\simkai.xml", };TTFReader.main(parameters);}
//E:\\test\\simkai.xml  目标文件生成路径  

1.3添加依赖

<dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>fop</artifactId><version>2.7</version>
</dependency>

2.编写xml数据文件

<?xml version="1.0" encoding="UTF-8"?>
<xmxxs><mdw>XXXXXXX有限公司</mdw><fprq>2022-06-01</fprq><xmxx><mgh>100000</mgh><mrq>2022-05-20</mrq><mzy>产品名称1</mzy><mdw>袋</mdw><msl>3200.00</msl><mdj>2.5</mdj><mxsje>8000.00</mxsje></xmxx><xmxx><mgh>80147497</mgh><mrq>2022-05-20</mrq><mzy>产品名称2</mzy><mdw>袋</mdw><msl>2200.00</msl><mdj>2.2</mdj><mxsje>9000.00</mxsje></xmxx><kpy>王XX</kpy><ywy>何XX</ywy>
</xmxxs>

3.编写xslt模板文件

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:fo="http://www.w3.org/1999/XSL/Format"><xsl:output method="xml" indent="yes"/><!--根模板--><xsl:template match="/"><fo:root><fo:layout-master-set><fo:simple-page-master master-name="A4-portrait"page-height="29.7cm" page-width="21.0cm" margin="2cm"><fo:region-body/></fo:simple-page-master></fo:layout-master-set><fo:page-sequence master-reference="A4-portrait" font-family="simkai"><fo:flow flow-name="xsl-region-body"><fo:table><fo:table-body><fo:table-row><fo:table-cell><fo:block ><xsl:value-of select="xmxxs/mdw"/></fo:block></fo:table-cell><fo:table-cell><fo:block ><xsl:value-of select="xmxxs/fprq"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table><br></br><fo:table><fo:table-body border-style="solid"><xsl:for-each select="xmxxs/xmxx"><fo:table-row border-style="solid"><fo:table-cell border-style="solid" width="70px"><fo:block><xsl:value-of  select="mgh"/></fo:block><br></br><fo:block><xsl:value-of select="mrq"/></fo:block></fo:table-cell><fo:table-cell border-style="solid" width="220px"><fo:block><xsl:value-of select="mzy"/></fo:block></fo:table-cell><fo:table-cell border-style="solid" width="110px"><fo:block><xsl:value-of select="mdw"/></fo:block><br></br><fo:block><xsl:value-of select="msl"/></fo:block></fo:table-cell><fo:table-cell border-style="solid" width="50px"><fo:block><xsl:value-of select="mdj"/></fo:block></fo:table-cell><fo:table-cell border-style="solid" width="50px"><fo:block><xsl:value-of select="mxsje"/></fo:block></fo:table-cell></fo:table-row></xsl:for-each></fo:table-body></fo:table><br></br><fo:table><fo:table-body><fo:table-row><fo:table-cell><fo:block ><xsl:value-of select="xmxxs/kpy"/></fo:block></fo:table-cell><fo:table-cell><fo:block ><xsl:value-of select="xmxxs/ywy"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:flow></fo:page-sequence></fo:root></xsl:template></xsl:stylesheet>

4.修改fop配置文件

根据指定的字体(小编在使用simhei的字体出现了繁体乱码,后面改用simkai就可以了),在fop.xconf中添加以下内容:

 <fonts><font metrics-url="src/main/resources/simkai.xml" kerning="yes" embed-url="file:C:\Windows\Fonts\simkai.ttf"><font-triplet name="simkai" style="normal" weight="normal"/><font-triplet name="simkai" style="normal" weight="bold"/><font-triplet name="simkai" style="italic" weight="normal"/><font-triplet name="simkai" style="italic" weight="bold"/></font>

5.main方法

public static void main(String[] args) {Charset utf8 = Charset.forName("UTF-8");try {// Setup directoriesFile baseDir = new File("src/main/resources");File outDir = new File(baseDir, "out");outDir.mkdirs();// Setup input and output filesFile xmlfile = new File(baseDir, "fp.xml");File xsltfile = new File(baseDir, "fp.xslt");File pdffile = new File(outDir, "fp.pdf");DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder();//指定fop配置文件Configuration cfg = cfgBuilder.buildFromFile(new File("src/main/resources/fop-2.7-bin/fop-2.7/fop/conf/fop.xconf"));FopFactoryBuilder fopFactoryBuilder = new FopFactoryBuilder(new File(".").toURI()).setConfiguration(cfg);// configure fopFactory as desiredfinal FopFactory fopFactory = fopFactoryBuilder.build();FOUserAgent foUserAgent = fopFactory.newFOUserAgent();// configure foUserAgent as desired// Setup outputOutputStream out = new FileOutputStream(pdffile);out = new BufferedOutputStream(out);try {// Construct fop with desired output formatFop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);// Setup XSLTTransformerFactory factory = TransformerFactory.newInstance();FileInputStream fis=new FileInputStream(xsltfile);Transformer transformer = factory.newTransformer(new StreamSource(new InputStreamReader(new FileInputStream(xsltfile),utf8 )));// Set the value of a <param> in the stylesheettransformer.setParameter("versionParam", "2.0");// Setup input for XSLT transformationSource src = new StreamSource(new InputStreamReader(new FileInputStream(xmlfile),utf8 ));// Resulting SAX events (the generated FO) must be piped through to FOPResult res = new SAXResult(fop.getDefaultHandler());// Start XSLT transformation and FOP processingtransformer.transform(src, res);} finally {out.close();}System.out.println("生成PDF------Success!");} catch (Exception e) {System.out.println("生成PDF------Fail!");e.printStackTrace(System.err);System.exit(-1);}}

Apache FOP生成PDF相关推荐

  1. 使用Apache XML项目FOP生成PDF文件(上)

    使用Apache XML项目FOP生成PDF文件(上) 一.前言:在项目中遇到要把文档保存成PDF文件,在网上找了很久之方面的资料,终于发现了Apache的FOP项目有这个功能. 二.适合读者对象:想 ...

  2. flying-saucer生成PDF

    不久前我的博客记录了一种[url=http://xpenxpen.iteye.com/blog/2087251]用fop生成PDF[/url]的方法,个人感觉不是太好.有以下原因: fop有点老了,而 ...

  3. java 生成pdf 乱码_利用java处理fop导出pdf的中文乱码问题解决方案

    本文的作用是,生成带中文的加密pdf格式的文件,防止被人修改. 在项目下建立docbook-xsl, fo-res, out, sample四个文件夹 docbook-xsl目录: 放从sourcef ...

  4. Aspose-Cells结合Apache POI生成excel文件以及转换为pdf

    最近有个需求是需要将数据库中的符合条件的交易流水导出生成为excel,并转换为pdf,提供给客户下载,客户下载核对并签章. 需要用到的jar包依赖: <dependency><gro ...

  5. php文件保存类库,PHP生成PDF文件类库大全[开源]

    虽然 PHP 有附 PDFlib ,不过使用起来实在有点复杂. (PHP 说明文件中的范例) FPDF 虽然现在已经停止更新了,但 FPDF 可谓是元老级的 PDF 链接库,短短的几行程序就可以产生出 ...

  6. Apache FOP与Eclipse和OSGi的集成

    Apache FOP是由XSL格式化对象( XSL-FO )驱动的开源打印处理器. 例如,将数据对象转换为PDF可能非常有用. 但是,将其集成到PDE中并最终以OSGi Service的形式运行并最终 ...

  7. itext根据数据生成PDF

    前言: 使用模板的方式开生成PDF文件 1.下载Adobe Acrobat DC,使用正式版(可以试用7天) 2.打开模板编辑表单域: 选择工具–>准备表单 3.编辑文本域属性 根据要求的模板设 ...

  8. Java使用itext生成Pdf

    Java使用itext生成Pdf 背景 所需依赖 解决jpedal-lgpl jar包问题 示例代码 生成带图片的PDF(使用本地文件系统图片) 生成带图片的PDF(使用网络图片) 背景 在某些业务场 ...

  9. PHP生成PDF完美支持中文,解决TCPDF乱码

    PHP生成PDF完美支持中文,解决TCPDF乱码 2011-09-26 09:04 418人阅读 评论(0) 收藏 举报 phpfontsheaderttfxhtml文档 PHP生成PDF完美支持中文 ...

  10. 利用velocity模板以及itext生成pdf

    利用velocity模板以及itext生成pdf 我整理的源码:http://download.csdn.net/download/u012174571/8748897 首先是velocity的使用: ...

最新文章

  1. 设置Eclipse可以Debug模式调试JDK源码,并显示局部变量的值
  2. 【iCore4 双核心板_FPGA】例程七:状态机实验——状态机使用
  3. itools下载链接被360警告:虚假招聘网站
  4. python高阶函数map_简单了解python高阶函数map/reduce
  5. asp.net 的web.config文件编写
  6. UWP 颜色选择器(ColorPicker) 和 自定义的Flyout(AdvancedFlyout)
  7. 给大家推荐一本书啊啊~
  8. mysql ODBC连接配置
  9. piap.excel 微软 时间戳转换mssql sql server文件时间戳转换unix 导入mysql
  10. 流媒体传输协议浅析(三)可靠UDP传输方案
  11. 优质短信api接口具备的特点
  12. 通过GetVersionEx获取Win10版本号
  13. 黑客组织“洋葱狗”潜伏3年终曝光 定期偷袭能源及交通行业
  14. T430系统盘迁移到SSD上的经验
  15. 从首个IMO季军谈起 作者 : 付云皓
  16. BadBoy录制脚本jmeter打开
  17. Cadence 怎么给shape倒角
  18. 教你禁用Windows 10中的各种小广告
  19. att汇编教程 linux,att 汇编 helloworld
  20. 计算机 发声原理,模拟电子琴演奏程序设计。微机中扬声器控制发声原理如练习图10.1所示,其中用到8255与8253两个芯片。...

热门文章

  1. python 象棋 ai 入门教程-用turtle画中国象棋棋盘
  2. 基频和倍频的概念_基频峰,泛频峰,倍频峰,二倍频峰的区别
  3. calibre版本问题造成无法转换pdf
  4. 已知ip地址如何算默认网关
  5. 为什么要研究游戏AI呢?
  6. 解除百度云下载限制速度(谷歌浏览器)
  7. 阅读 SICP 感想(0. 关于前言和序言)
  8. 家用路由器及NAT协议
  9. 物联网离线语音控制智能家居系统设计(三):ESP8266(Arduino IDE)连接阿里云物联网平台
  10. (转载)傅里叶分析之掐死教程(完整版)