x-easypdf v2.11.0 版本发布,【fop 模块】一大波更新来袭


x-easypdf v2.11.0 版本发布,【fop模块】一大波更新来袭

logo

x-easypdf是一个基于pdfbox/fop二次封装的框架,目前拥有两大模块:【pdfbox模块】与【fop模块】。【pdfbox模块】主打pdf编辑功能,以组件化的形式进行pdf的构建;【fop模块】主打pdf导出功能,采用数据源的方式对xsl-fo模板进行转换,同时提供java对象的方式构建dom模板文档,即使完全不懂xsl-fo的语法,也能轻松上手写出对应的模板。两个模块均可单独使用,也可以结合使用,帮助开发者快速生成pdf文档。

本次更新内容如下:

新特性:

  • 【fop模块】新增XEasyPdfTemplatePageRectangle类(页面尺寸)
  • 【fop模块】新增freemarker数据源(模板引擎)
  • 【fop模块】新增jte数据源(模板引擎)
  • 【fop模块】xml数据源新增设置xml数据输入流的方法
  • 【fop模块】模板对象新增保存模板的方法
  • 【fop模块】新增书签组件
  • 【fop模块】新增块组件(组件容器)
  • 【fop模块】新增当前页码组件
  • 【fop模块】新增总页码组件
  • 【fop模块】新增水印(文字)组件
  • 【fop模块】组件新增设置id的方法
  • 【fop模块】组件新增设置分页符-前的方法
  • 【fop模块】组件新增设置分页符-后的方法
  • 【fop模块】组件新增设置开启分页时保持的方法
  • 【fop模块】组件新增设置开启分页时与上一个元素保持的方法
  • 【fop模块】组件新增设置开启分页时与下一个元素保持的方法
  • 【fop模块】表格组件新增设置文本语言的方法
  • 【fop模块】表格组件新增设置行间距的方法
  • 【fop模块】表格组件新增设置字符间距的方法
  • 【fop模块】表格组件新增设置单词间距的方法
  • 【fop模块】表格组件新增设置单词换行的方法
  • 【fop模块】表格组件新增设置空白空间的方法
  • 【fop模块】表格组件新增设置字体名称的方法
  • 【fop模块】表格组件新增设置字体样式的方法
  • 【fop模块】表格组件新增设置字体重量的方法
  • 【fop模块】表格组件新增设置字体大小的方法
  • 【fop模块】表格组件新增设置字体大小调整的方法
  • 【fop模块】表格组件新增设置字体颜色的方法
  • 【fop模块】表格组件新增设置最小行高的方法
  • 【fop模块】表格组件新增设置最小列宽的方法
  • 【fop模块】表格组件新增设置边框圆角的方法
  • 【fop模块】表格组件新增设置背景颜色的方法
  • 【fop模块】表格单元格组件新增设置背景的方法
  • 【fop模块】表格单元格组件新增设置背景图片的方法
  • 【fop模块】表格单元格组件新增设置背景附件的方法
  • 【fop模块】表格单元格组件新增设置背景颜色的方法
  • 【fop模块】表格单元格组件新增设置背景图片定位的方法
  • 【fop模块】表格单元格组件新增设置背景图片水平定位的方法
  • 【fop模块】表格单元格组件新增设置背景图片垂直定位的方法
  • 【fop模块】表格单元格组件新增设置背景图片重复的方法
  • 【fop模块】表格单元格组件新增设置上下左右边框样式的方法
  • 【fop模块】表格单元格组件新增设置上下左右边框颜色的方法
  • 【fop模块】表格单元格组件新增设置上下左右边框宽度的方法
  • 【fop模块】表格单元格组件新增设置文本语言的方法
  • 【fop模块】表格单元格组件新增设置行间距的方法
  • 【fop模块】表格单元格组件新增设置字符间距的方法
  • 【fop模块】表格单元格组件新增设置单词间距的方法
  • 【fop模块】表格单元格组件新增设置单词换行的方法
  • 【fop模块】表格单元格组件新增设置空白空间的方法
  • 【fop模块】表格单元格组件新增设置字体名称的方法
  • 【fop模块】表格单元格组件新增设置字体样式的方法
  • 【fop模块】表格单元格组件新增设置字体重量的方法
  • 【fop模块】表格单元格组件新增设置字体大小的方法
  • 【fop模块】表格单元格组件新增设置字体大小调整的方法
  • 【fop模块】表格单元格组件新增设置字体颜色的方法
  • 【fop模块】表格单元格组件新增设置合并行数的方法
  • 【fop模块】表格单元格组件新增设置合并列数的方法
  • 【fop模块】文本组件新增设置单词间距的方法
  • 【fop模块】文本组件新增设置单词换行的方法
  • 【fop模块】文本组件新增设置空白空间的方法
  • 【fop模块】文本组件新增设置文本缩进的方法
  • 【fop模块】文本组件新增设置段前缩进的方法
  • 【fop模块】文本组件新增设置段后缩进的方法
  • 【fop模块】文本组件新增设置段前空白的方法
  • 【fop模块】文本组件新增设置段后空白的方法
  • 【fop模块】文本组件新增设置字体重量的方法
  • 【fop模块】文本组件新增设置内部地址的方法
  • 【fop模块】文本组件新增设置外部地址的方法
  • 【fop模块】文本组件新增设置开启超链接的方法
  • 【fop模块】文档组件新增添加书签组件的方法
  • 【fop模块】文本组件新增设置文本语言的方法
  • 【fop模块】文本组件新增设置垂直对齐的方法
  • 【fop模块】文本组件新增设置背景颜色的方法
  • 【fop模块】文本扩展组件新增设置背景颜色的方法
  • 【fop模块】文本扩展组件新增设置初始化容量的方法
  • 【fop模块】文本扩展组件新增设置文本间隔的方法
  • 【fop模块】页面新增设置id的方法
  • 【fop模块】页面新增设置背景的方法
  • 【fop模块】页面新增设置背景图片的方法
  • 【fop模块】页面新增设置背景附件的方法
  • 【fop模块】页面新增设置背景颜色的方法
  • 【fop模块】页面新增设置背景图片定位的方法
  • 【fop模块】页面新增设置背景图片水平定位的方法
  • 【fop模块】页面新增设置背景图片垂直定位的方法
  • 【fop模块】页面新增设置背景图片重复的方法
  • 【fop模块】页面新增设置水印组件的方法
  • 【fop模块】页面新增设置左侧栏组件的方法
  • 【fop模块】页面新增设置右侧栏组件的方法
  • 【fop模块】条形码组件新增设置条形码文字名称的方法
  • 【pdfbox模块】水印组件新增支持多行文本

原有变更:

  • 【fop模块】包结构调整
  • 【fop模块】各组件设置颜色的方法参数调整
  • 【fop模块】图像组件移除开启远程(远程图像)的方法
  • 【fop模块】调整默认模板引擎,由thymeleaf调整为freemarker

问题修复:

  • 【fop模块】修复png类型图像加载错误问题(#I60D8K)
  • 【fop模块】修复生成后的条形码内容异常问题

后续规划:

  • 进一步完善【fop模块】相关文档,提供更多的示例及效果展示
  • 开启【pdfbox模块】3.0重构计划,欢迎大家在 Issues 上提出宝贵建议
  • 【fop模块】将专注于pdf导出功能,【pdfbox模块】将专注于pdf编辑功能

本次更新后,【fop模块】已基本达到生产可用水平(java对象方式),即使完全不懂xsl-fo语法,也可使用对象方式轻松生成对应模板,再使用模板引擎进行渲染,让导出pdf变得更easy!同时也欢迎大家提出宝贵建议,帮助本项目更加好用,谢谢支持。

以下为本次更新后的java对象方式生成pdf文档的部分功能使用演示:

@Test
public void document() {
// 定义输出路径
String outputPath = "E:\\\\pdf\\\\test\\\\fo\\\\template-demo.pdf";
// 定义书签
XEasyPdfTemplateBookmark bookmark = XEasyPdfTemplateHandler.Bookmark.build()
// 设置标题
.setTitle("目录")
// 设置内部地址(对应组件id)
.setInternalDestination("title");
// 创建标题
XEasyPdfTemplateText title = XEasyPdfTemplateHandler.Text.build()
// 设置id
.setId("title")
// 设置文本
.setText("贵阳市简介")
// 设置字体大小
.setFontSize("20pt")
// 设置水平居中
.setHorizontalStyle("center");
// 创建扩展文本
XEasyPdfTemplateTextExtend createText = XEasyPdfTemplateHandler.TextExtend.build()
// 设置字体大小
.setFontSize("12pt")
// 设置段前空白
.setSpaceBefore("12pt")
// 设置段前缩进
.setStartIndent("60pt")
// 设置文本间隔
.setTextSpacing("80pt")
// 设置文本
.addText(
XEasyPdfTemplateHandler.Text.build().setText("创建时间:2022-11-11 00:00:00"),
XEasyPdfTemplateHandler.Text.build().setText("创建人:x-easypdf")
);

// 创建二维码
XEasyPdfTemplateBarcode barcode = XEasyPdfTemplateHandler.Barcode.build()
// 设置条形码类型
.setType("qr_code")
// 设置条形码内容
.setContent("https://baike.baidu.com/item/贵阳/438289")
// 设置条形码说明文字
.setWords("扫一扫")
// 设置条形码图像宽度
.setWidth("60pt")
// 设置条形码图像高度
.setHeight("60pt")
// 设置水平居右
.setHorizontalStyle("right")
// 设置上移62pt
.setMarginTop("-62pt");
// 创建文本
XEasyPdfTemplateText text = XEasyPdfTemplateHandler.Text.build()
// 设置id
.setId("text")
// 设置文本
.setText(
"贵阳,简称“筑”,别称林城、筑城,贵州省辖地级市、省会、Ⅰ型大城市,国务院批复确定的中国西南地区重要的中心城市之一、" +
"重要的区域创新中心和全国重要的生态休闲度假旅游城市。" +
"贵阳地处黔中山原丘陵中部,东南与黔南布依族苗族自治州的瓮安、龙里、惠水、长顺4县接壤," +
"西靠安顺市的平坝区和毕节市的织金县,北邻毕节市的黔西市、金沙县和遵义市的播州区," +
"截至2020年,全市下辖6个区、3个县,代管1个县级市。截至2021年末,贵阳市常住人口610.23万人。"
)
// 设置段前空白
.setSpaceBefore("12pt")
// 设置文本缩进
.setTextIndent("24pt");
// 创建文本
XEasyPdfTemplateText remark = XEasyPdfTemplateHandler.Text.build()
// 设置文本
.setText("-- 摘自百度百科")
// 设置字体大小
.setFontSize("12pt")
// 设置水平居右
.setHorizontalStyle("right");
// 创建子书签
XEasyPdfTemplateBookmark child = XEasyPdfTemplateHandler.Bookmark.build()
// 设置标题
.setTitle("贵阳市行政区划")
// 设置内部地址(对应组件id)
.setInternalDestination("tableText");
// 添加子书签
bookmark.addChild(child);
// 创建文本
XEasyPdfTemplateText tableText = XEasyPdfTemplateHandler.Text.build()
// 设置id
.setId("tableText")
// 设置文本
.setText("贵阳市行政区划")
// 设置字体大小
.setFontSize("20pt")
// 设置当前位置分页
.setBreakBefore("page")
// 设置段前空白
.setSpaceBefore("20pt")
// 设置水平居右
.setHorizontalStyle("center");
// 创建表格
XEasyPdfTemplateTable table = XEasyPdfTemplateHandler.Table.build().setHeader(
// 设置表头
XEasyPdfTemplateHandler.Table.Header.build().addRow(
this.createRow("#7C7D7D", "center", "名称", "区划代码", "人口(万人)", "面积(平方千米)")
)
).setBody(
// 设置表格主体
XEasyPdfTemplateHandler.Table.Body.build().addRow(
this.createRow(null, "left", "贵阳市", "520100", "599", "8035"),
this.createRow(null, "left", "南明区", "520102", "105", "271"),
this.createRow(null, "left", "云岩区", "520103", "106", "94"),
this.createRow(null, "left", "花溪区", "520111", "97", "964"),
this.createRow(null, "left", "乌当区", "520112", "34", "686"),
this.createRow(null, "left", "白云区", "520113", "46", "270"),
this.createRow(null, "left", "观山湖区", "520115", "64", "309"),
this.createRow(null, "right", "清镇市", "520181", "63", "1302"),
this.createRow(null, "right", "开阳县", "520121", "34", "2026"),
this.createRow(null, "right", "息烽县", "520122", "22", "1037"),
this.createRow(null, "right", "修文县", "520123", "29", "1076")
)
).setMinRowHeight("30pt").setVerticalStyle("center");
// 创建页面
XEasyPdfTemplatePage page = XEasyPdfTemplateHandler.Page.build()
// 设置页面id
.setId("pageId")
// 设置字体
.setFontFamily("微软雅黑")
// 设置字体大小
.setFontSize("15pt")
// 设置边距(上下左右)
.setMargin("20pt")
// 设置主体内容
.addBodyComponent(title, createText, barcode, text, remark, tableText, table)
// 设置页脚高度
.setFooterHeight("20pt")
// 设置页脚内容
.addFooterComponent(
// 创建块容器并添加内容
XEasyPdfTemplateHandler.BlockContainer.build().addComponent(
// 创建文本
XEasyPdfTemplateHandler.Text.build().setText("第 "),
// 创建当前页码
XEasyPdfTemplateHandler.CurrentPageNumber.build(),
XEasyPdfTemplateHandler.Text.build().setText(" 页,共 "),
// 创建总页码并设置页面id
XEasyPdfTemplateHandler.TotalPageNumber.build().setPageId("pageId"),
XEasyPdfTemplateHandler.Text.build().setText(" 页")
).setHorizontalStyle("center")
)
// 设置主体水印
.setBodyWatermark(
// 创建文字水印
XEasyPdfTemplateHandler.Watermark.build()
// 设置水印图片目录
.setTempDir("E:\\\\pdf\\\\test\\\\fo")
// 设置水印id
.setId("watermark")
// 设置水印内容
.setText("贵阳", "x-easypdf")
// 设置水印图像宽度
.setWidth("600pt")
// 设置水印图像高度
.setHeight("300pt")
// 设置水印显示宽度
.setShowWidth("200pt")
// 设置文字大小
.setFontSize("100pt")
// 设置文字颜色
.setFontColor("gray")
// 设置文字透明度
.setFontAlpha("100")
// 设置逆时针旋转
.setRadians("-45")
// 开启文件覆盖
.enableOverwrite()
);
// 添加页面、书签并转换
XEasyPdfTemplateHandler.Document.build().addPage(page).addBookmark(bookmark).transform(outputPath);
}

private XEasyPdfTemplateTableRow createRow(String backgroundColor, String style, String... texts) {
XEasyPdfTemplateTableRow row = XEasyPdfTemplateHandler.Table.Row.build();
for (int i = 0; i < texts.length; i++) {
row.addCell(
XEasyPdfTemplateHandler.Table.Cell.build().addComponent(
XEasyPdfTemplateHandler.Text.build().setText(texts[i])
).setBorderStyle("solid").setBackgroundColor(backgroundColor).setHorizontalStyle(style)
);
}
return row;
}

生成的对应模板(格式化后):

<?xml version="1.0" encoding="UTF-8"?>
<!--根标签-->
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fox="http://xmlgraphics.apache.org/fop/extensions">
<!--页面模板-->
<fo:layout-master-set>
<fo:simple-page-master margin-bottom="20pt" margin-left="20pt" margin-right="20pt" margin-top="20pt" master-name="page1" page-height="29.7cm" page-width="21cm">
<fo:region-body background-image="url('/E:/pdf/test/fo/watermark.png')" fox:background-image-width="200pt"/>
<fo:region-before/>
<fo:region-after extent="20pt"/>
<fo:region-start/>
<fo:region-end/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:bookmark-tree>
<fo:bookmark internal-destination="title">
<fo:bookmark-title>目录</fo:bookmark-title>
<fo:bookmark internal-destination="tableText">
<fo:bookmark-title>贵阳市行政区划</fo:bookmark-title>
</fo:bookmark>
</fo:bookmark>
</fo:bookmark-tree>
<fo:page-sequence font-family="微软雅黑" font-size="15pt" id="pageId" master-reference="page1">
<fo:static-content flow-name="xsl-region-after">
<fo:block-container>
<fo:block text-align="center">
<fo:inline>第 </fo:inline>
<fo:page-number/>
<fo:inline>页,共 </fo:inline>
<fo:page-number-citation-last ref-id="pageId"/>
<fo:inline>页</fo:inline>
</fo:block>
</fo:block-container>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block id="title" text-align="center">
<fo:inline font-size="20pt">贵阳市简介</fo:inline>
</fo:block>
<fo:block space-before="12pt" start-indent="60pt">
<fo:inline font-size="12pt">创建时间:2022-11-11 00:00:00</fo:inline>
<fo:leader leader-length="80pt"/>
<fo:inline font-size="12pt">创建人:x-easypdf</fo:inline>
</fo:block>
<fo:block margin-top="-62pt" text-align="right">
<fo:instream-foreign-object>
<fo:barcode content="https://baike.baidu.com/item/贵阳/438289" height="60pt" type="qr_code" width="60pt" words="扫一扫" xmlns:fo="http://www.x-easypdf.cn/ns"/>
</fo:instream-foreign-object>
</fo:block>
<fo:block id="text" space-before="12pt" text-indent="24pt">
<fo:inline text-indent="24pt">贵阳,简称“筑”,别称林城、筑城,贵州省辖地级市、省会、Ⅰ型大城市,国务院批复确定的中国西南地区重要的中心城市之一、重要的区域创新中心和全国重要的生态休闲度假旅游城市。贵阳地处黔中山原丘陵中部,东南与黔南布依族苗族自治州的瓮安、龙里、惠水、长顺4县接壤,西靠安顺市的平坝区和毕节市的织金县,北邻毕节市的黔西市、金沙县和遵义市的播州区,截至2020年,全市下辖6个区、3个县,代管1个县级市。截至2021年末,贵阳市常住人口610.23万人。</fo:inline>
</fo:block>
<fo:block text-align="right">
<fo:inline font-size="12pt">-- 摘自百度百科</fo:inline>
</fo:block>
<fo:block break-before="page" id="tableText" space-before="20pt" text-align="center">
<fo:inline font-size="20pt">贵阳市行政区划</fo:inline>
</fo:block>
<fo:block>
<fo:table display-align="center">
<fo:table-header>
<fo:table-row>
<fo:table-cell background-color="#7c7d7d" border-style="solid" height="30pt" text-align="center">
<fo:block>
<fo:inline>名称</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell background-color="#7c7d7d" border-style="solid" height="30pt" text-align="center">
<fo:block>
<fo:inline>区划代码</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell background-color="#7c7d7d" border-style="solid" height="30pt" text-align="center">
<fo:block>
<fo:inline>人口(万人)</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell background-color="#7c7d7d" border-style="solid" height="30pt" text-align="center">
<fo:block>
<fo:inline>面积(平方千米)</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>贵阳市</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>520100</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>599</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>8035</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>南明区</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>520102</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>105</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>271</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>云岩区</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>520103</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>106</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>94</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>花溪区</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>520111</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>97</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>964</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>乌当区</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>520112</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>34</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>686</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>白云区</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>520113</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>46</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>270</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>观山湖区</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>520115</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>64</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="left">
<fo:block>
<fo:inline>309</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>清镇市</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>520181</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>63</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>1302</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>开阳县</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>520121</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>34</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>2026</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>息烽县</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>520122</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>22</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>1037</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>修文县</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>520123</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>29</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" height="30pt" text-align="right">
<fo:block>
<fo:inline>1076</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>

pdf文档效果:

生成效果


相關推薦

2022-09-03

x-easypdf v2.10.1 版本发布,新增fop模块表格组件 x-easypdf基于pdfbox/fop二次封装,拥有两大模块:pdfbox模块极大降低pdfbox的使用门槛,以组件化的形式进行pdf的构建;fop模块采用数据源的方式对xsl-fo模板进行转换。两个模块均可单

2023-02-27

x-easypdf v2.11.3 版本发布,【fop模块】新增xsd约束 ​ ​ x-easypdf是一个基于pdfbox/fop二次封装的框架,目前拥有两大模块:【pdfbox模块】与【fop模块】。【pdfbox模块】主打pdf编辑功能,以组件化的形式进行pdf的构建;【fop模

2023-03-13

​ ​ x-easypdf是一个基于pdfbox/fop二次封装的框架,目前拥有两大模块:【pdfbox模块】与【fop模块】。【pdfbox模块】主打pdf编辑功能,以组件化的形式进行pdf的构建;【fop模块】主打pdf导出功能,采用数据源的方式对xsl-fo模板

2024-01-03

化:流程名称字段长度改为20,说明长度改为40 优化:core模块相关代码由controller移到service处理 修复:条件分支中用户条件显示异常

2023-12-16

avue v2.11.0 已经发布,基于 Element 的前端框架 此版本更新内容包括: v2.11.0 2023-12-15 新增 新增Upload组件腾讯云COS存储gitee_I69AAC,在线例子 新增InputTabel组件多选和禁止参数gitee_I6U771在线例子 新增Select组件字典class属性gitee_I

2022-08-02

x-easypdf v2.9.9 版本发布,新增文本角标组件 x-easypdf基于pdfbox二次封装,极大降低使用门槛,以组件化的形式进行pdf的构建。简单易用,帮助开发者快速生成pdf文档。 本次更新内容如下: 新特性: 新增单元格组件开启自动

2023-06-16

启后续 2.1.0 的开发工作 重大更新 [不兼容升级] java 版本从 jdk 8 升级到 jdk 17 且需要使用 graalvm 运行(暂时未解决原生jdk存在的问题) [不兼容升级] springboot 升级 3.0 版本 [不兼容升级] springcloud 升级 2022 版本 [不兼容升

2023-11-01

更新日志 [新增] avatar 组件 fullback 属性,图片加载失败时的回调。 [新增] avatar 组件 auto-fix-size 属性,自动调节 icon 与 font 尺寸。 [新增] avatar-list 组件 size 属性,统一 slots 内 avatar 组件 size 属性。 [新增] avatar-list 组件 radius 属

2023-04-18

【基础版】    🚨 Breaking Changes 调整应用配置的配置项,并将应用配置按钮从工具栏删除    🚀 Features 引入 stylelint-stylistic 插件 【专业版】    🚨 Breaking Changes 调整应

2023-09-06

明 由于SpringBoot2.X与vue2.X均在11月底停止维护 故而咱们vue版本1.X也无法再继续更新 介于1.X的用户量特别庞大 功能也非常的稳定 计划于11月底同Boot2.X一同停止更新但还会持续维护修复bug(修复的形式为直接提交到1.X分支停止发版)

2023-09-15

交互组件:https://github.com/devlive-community/openai-java-sdk 该版本着重支持 Apache Seatunnel 作为流水线支持框架 DataCap 已发布 发布版本 发布时间 1.14.0 2023-09-14 General 修复数据源检查任务返回空的问题 添

2023-03-16

我们会一直坚持。 社区版 v2.13.0 发布 增加云服务版本地址 全新开发文档,使用vitepress搭建 可以生成SDK调用代码,让开发更简单 专业版 v2.0.16 初始化脚本 调整尺寸 增加日志示例配置 增加绘图错误日

2023-04-16

今天sms4j迎来了第一个大版本更新,2.0.0版本正式发布! 本次的发布不仅仅项目结构发生了调整和变化,同时还伴随着诸多新的厂商和功能,下面我们来一起简单的看一下吧! 首先是maven的变化 老版本中,groupId为作者的个人

2022-12-04

件包管理器构建的 Linux 发行版,推出了今年的最后一个版本。 NixOS 在这个版本中为 nixpkgs 增加了 16678 个新的软件包和 14680 个更新软件包,该版本还删除了 2812 个软件包,以保持软件包集的可维护性和安全性。除了软件包之外