一、概述

一个 java 语言简化处理 pdf 的框架

项目主页

https://x-easypdf.cn

项目概述

x-easypdf是一个java语言简化处理pdf的框架,包含fop模块与pdfbox模块,fop模块以创建功能为主,基于xsl-fo模板生成pdf文档,以数据源的方式进行模板渲染;pdfbox模块以编辑功能为主,对标准的pdfbox进行扩展,添加了成吨的功能。

项目特性

fop模块

以创建功能为主,基于 xsl-fo 模板生成 pdf 文档,以数据源的方式进行模板渲染。

  • 基于模板生成
  • 内置多种数据源(xml 数据源、thymeleaf 数据源、freemarker 数据源、jte 数据源、document 数据源)
  • 提供面向对象的方式生成模板(document 数据源)
  • 灵活的扩展性
pdfbox模块

以编辑功能为主,对标准的 pdfbox 进行扩展,添加了成吨的功能。

  • 超出页面宽度自动换行,超出页面高度自动分页
  • 内置华为鸿蒙字体,天然支持中文文本
  • 内置页眉页脚,简单快捷
  • 内置多个组件,满足不同的需求
  • 内置多种扩展器,方便解析、提取与处理文档内容
  • 支持自定义组件与扩展

springboot简单集成测试

        <dependency>
<groupId>org.dromara.x-easypdf</groupId>
<artifactId>x-easypdf</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.dromara.x-easypdf</groupId>
<artifactId>x-easypdf-pdfbox</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.dromara.x-easypdf</groupId>
<artifactId>x-easypdf-fop</artifactId>
<version>3.2.1</version>
</dependency>

测试代码:

  @Test
void contextLoads() {
String content = "\t先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。\n" +
"\n" +
"宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。\n" +
"\n" +
"侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。\n" +
"\n" +
"将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。\n" +
"\n" +
"亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。\n" +
"\n" +
"臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。\n" +
"\n" +
"先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。\n" +
"\n" +
"愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。\n" +
"\n" +
"今当远离,临表涕零,不知所言。"; // (1)PDFBox方式创建文件
Document document = PdfHandler.getDocumentHandler().create();
// 设置使用字体
document.setFontName("仿宋");
// 创建页面
Page page = new Page(document);
// 创建文本域
Textarea textarea = new Textarea(page);
// 设置文本
textarea.setText(content);
// 设置字体颜色
textarea.setFontColor(Color.BLUE);
// 渲染文本
textarea.render();
// 添加页面
document.appendPage(page);
// 保存文档
document.save("E:\\PDF\\出师表(1).pdf");
// 关闭文档
document.close(); //(2)模板方式创建文件
TemplateHandler.Document.build().addPage(TemplateHandler.Page.build().
addBodyComponent(TemplateHandler.Text.build().
setFontFamily("宋体").
setText(content))).
setAuthor("诸葛亮").
setSubject("出师表").
setTitle("出师表").
transform("E:\\PDF\\出师表(2).pdf");
}

文档效果:

(1)PDFBox方式创建文件

(2)模板方式创建文件

源地址:x-easypdf:一个 java 语言简化处理 pdf 的框架 - GitCode

x-easypdf 初始的更多相关文章

  1. 2DToolkit官方文档中文版打地鼠教程(一):初始设置

    这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...

  2. CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总

    CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总 开始 总的来说,OpenGL应用开发者会遇到为如下三种数据创建Vertex Buffer Object的情形: ...

  3. ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量

    当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...

  4. linux系统下使用xampp 丢失mysql root密码【xampp的初始密码为空】

    如果在ubuntu 下面 使用xampp这个集成开发环境,却忘记mysql密码. 注:刚安装好的xampp的Mysql初始密码是空... 找回密码的步骤如下: 1.停止mysql服务器 sudo /o ...

  5. python基础之初始python

    初始python之基础一 一.Python 介绍 1.python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发 ...

  6. openfire 初始密码

    openfire 初始密码 mssql2014 进入数据库,找到 ofUser 表 ,将密码字段对应的密文替换为下面的内容,则密码就是 admin ecbd03623cd819c48718db1b27 ...

  7. Bash 什么时候会给 HOME 赋初始值

    今天无意发现下面这个表现: $  env -i bash -c cd bash: line 0: cd: HOME not set $ env -i bash -c 'echo $HOME' 这表明了 ...

  8. Holt-Winters原理和初始值的确定

      关于模型 (来自以下PPT,从第4页开始)   关于初始值: 以下文档给出了三个模型的初始值计算的思路. 大致思路如下,建立一个p阶移动平均模型,估计出参数即为初始值,具体的根据三种不同的模型,有 ...

  9. 关于int,integer初始值问题

  10. C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析与解决方法

    对于C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析,目前本人分析两种情况,如下: 情况一: 借鉴麒麟.NET ...

随机推荐

  1. C++: 智能指针的自定义删除器 `Custom Deleter` 有什么用?

    C++11智能指针std::shared_ptr和std::unique_ptr都支持自定义删除器,本文将介绍自定义删除器的使用场景和使用方法.智能指针模板参数的第二个类型是删除器,一般是一个函数指针 ...

  2. SpringBoot 引入第三方 jar

    SpringBoot 引入第三方 jar 项目结构 -BCJS |--lib |--hsm-talos-1.0.1.jar |--src |--pom.xml step1 : 配置第三方 jar 为依 ...

  3. CMake构建学习笔记16-使用VS进行CMake项目的开发

    目录 1. 概论 2. 详论 2.1 创建工程 2.2 加载工程 2.3 配置文件 2.4 工程配置 2.5 调试执行 3. 项目案例 4. 总结 1. 概论 在之前的系列博文中,我们学习了如何构建第 ...

  4. Web核心

    JavaWeb 技术栈   

  5. 了解 Flutter 3.16 功能更新

    作者 / Kevin Chisholm 我们在季度 Flutter 稳定版发布会上带来了 Flutter 3.16,此版本包含诸多更新: Material 3 成为新的默认主题.为 Android 带 ...

  6. 图解YUV420、YUV420(YUY2)、YUV422(YVYU)

    Y:亮度分量    UV:色度分量 1.  标准yuv指的是yuv420 一般看文章,会出现下面的公式,但不涉及具体的yuv格式,其实这一定指的是yuv420 Y与RGB的演算关系为:Y = 0.21 ...

  7. 【赵渝强老师】Kafka的持久化

    一.Kafka持久化概述 Kakfa 依赖文件系统来存储和缓存消息.对于硬盘的传统观念是硬盘总是很慢,基于文件系统的架构能否提供优异的性能?实际上硬盘的快慢完全取决于使用方式.同时 Kafka 基于 ...

  8. urb中几个函数的使用

    usb_buffer_alloc(free) 说是为了更好的从名字看出这个函数真实做的事情:DMA coherency linux提供两种方式,来保证使用dma时,内存和硬件cache的一致性: us ...

  9. excel导出功能的实现流程说⼀下?

    导出的话,我们因为到处的数据量不⼤,所以直接采取的时候前端主导的⽅案,参考的现成⽅案实现的 导出 ⼤概得流程就是 1. 调⽤后端接⼝得到要导出的数据 2. 把数据简单处理⼀下转化成导出插件需要的格式 ...

  10. day03-了解ajax

    Ajax Ajax即Asynchronous Javascript And XML(异步JavaScript和XML). Ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,这使得程 ...