点击上方关注 “终端研发部

设为“星标”,和你一起掌握更多数据库知识
作者: Codingqi123
来源: jianshu.com/p/db15232987b9

在这篇文章中,我将举例说明如何创建一个包含标题,段落,图像,编号列表和表格的简单的PDF文件,以及如何使用Free Spire.PDF将PDF转换为其他文件格式。

Part1概述

Free Spire.PDF for Java是一个类库,您可以直接在Java程序中创建和处理PDF文件,而无需安装任何其他软件。使用此类库您可以轻松创建PDF文件。您只需创建一个PdfDocument对象,再根据需要创建足够数量的PdfPageBase对象,然后向页面添加字符串,图像,表格,列表等任何其他元素,最后保存文档。

Part2准备工作

https://links.jianshu.com/go?to=https%3A%2F%2Fwww.e-iceblue.com%2FDownload%2Fpdf-for-java-free.html下载Free Spire.PDF for Java,并在您的Java项目中导入Spire.Pdf.jar文件。

Part3坐标系

Spire.PDF生成的页面由边距和内容区域组成。坐标系仅存在于内容区域中,允许用户将内容添加到指定坐标。Spire.PDF中的坐标系遵循以下规则。

  • 坐标系的原点(0,0)即内容区域的左上角顶点。

  • X轴向右延伸,Y轴向下延伸。

Part4创建自定义函数

Spire.PDF提供了有用的类和方法,例如PdfPageBase类,drawString方法和drawImage方法,您可以借助它们进行页面设置,并添加文本和图像到指定坐标。为了使代码更便于阅读,我预先定义了以下五个自定义函数来执行不同的任务。

drawTitle

在PDF文件上绘制标题时,您可能需要对齐文本。基于drawString创建的drawTitle函数允许您将文本水平对齐,例如,居中对齐。

public static void drawTitle(PdfPageBase page, String text, PdfTrueTypeFont font, PdfBrush brush, float x, float y, PdfTextAlignment alignment) {//通过PdfStringFormat类库设置文本对齐PdfStringFormat format = new PdfStringFormat();format.setAlignment(alignment);//在页面绘制题目page.getCanvas().drawString(text, font, brush, x, y, format);
}

drawParagraph

drawParagraph函数与drawTitle不同,尽管它们采用类似的参数。此函数基于PdfTextWidget.draw方法创建,并返回PdfLayoutResult类的对象,该对象包含正在绘制的元素的边界信息。通过这样做,您能够知道当前段落的结束位置以及从何处开始绘制下一段内容。

public static PdfLayoutResult drawParagraph(PdfPageBase page, String text, PdfTrueTypeFont font, PdfBrush brush, float x, float y) {// 创建一个PdfTextWidget对象PdfTextWidget widget = new PdfTextWidget(text, font, brush);// dfLayoutType设置为分页,使内容自动分页PdfTextLayout layout = new PdfTextLayout();layout.setLayout(PdfLayoutType.Paginate);//在将要放置段落的地方创建一个矩形Rectangle2D.Float rect = new Rectangle2D.Float(0, y, (float) page.getClientSize().getWidth(), (float) page.getClientSize().getHeight());//在页面绘制段落PdfLayoutResult layoutResult = widget.draw(page, rect, layout);return layoutResult;
}

drawImage

drawImage函数简单地重载了原始方法。此函数不会返回PdfLayoutResult对象。为了知道以下内容开始的位置,您需要通过PdfImage对象获取图像高度,然后计算Y坐标。

public static void drawImage(PdfPageBase page, PdfImage image, float x, float y) {//在页面绘制图像page.getCanvas().drawImage(image, x, y);
}

drawTable

使用drawTable函数在PDF页面上绘制表格时,需要在String [] []数组中指定表格数据。此函数还会返回到PdfLayoutResult对象,该对象将帮助我们获取表格的位置和大小。

public static PdfLayoutResult drawTable(PdfPageBase page, String[][] dataSource, PdfTrueTypeFont font, float x, float y) {//创建一个PdfTable对象PdfTable table = new PdfTable();//填充指定单元格table.getStyle().setCellPadding(2);//设置字体table.getStyle().getDefaultStyle().setFont(font);//使用样本数据填充表格table.setDataSource(dataSource);//在页面绘制表格PdfLayoutResult layoutResult = table.draw(page, new Point2D.Float(x, y));return layoutResult;
}

drawSortedList

最后一个函数drawSortedList与drawTable非常相似,只是它需要一些独特的参数,如列表内容,顺序标记和列表缩进。

public static PdfLayoutResult drawSortedList(PdfPageBase page, String listContent, PdfOrderedMarker marker, PdfTrueTypeFont font, PdfBrush brush, float x, float y, float indent) {//根据列表内容创建排序列表PdfSortedList sortedList = new PdfSortedList(listContent);//设置列表属性sortedList.setFont(font);sortedList.setBrush(brush);sortedList.setIndent(indent);sortedList.setMarker(marker);//在页面绘制列表PdfLayoutResult layoutResult = sortedList.draw(page, x, y);return layoutResult;}

Part5使用的代码

调用这些自定义函数,您将能够在PDF页面的适当位置绘制元素。

import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfNumberStyle;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.*;
import com.spire.pdf.lists.*;
import com.spire.pdf.tables.PdfTable;import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;public class CreatePdf {public static void main(String[] args) {//创建一个PdfDocument对象PdfDocument doc = new PdfDocument();//添加页面PdfPageBase page = doc.getPages().add();//创建两个纯色笔刷PdfSolidBrush brush1 = new PdfSolidBrush(new PdfRGBColor(Color.BLUE));PdfSolidBrush brush2 = new PdfSolidBrush(new PdfRGBColor(Color.BLACK));//创建两种字体PdfTrueTypeFont font1 = new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN,  14), true);PdfTrueTypeFont font2 = new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN, 10), true);//初始化X轴和Y轴坐标float x = 0;float y = 0;//题目String title = "题目";//通过PdfTextAlignment类库将文本居中对齐PdfTextAlignment alignment = PdfTextAlignment.Center;//在文档中心绘制标题drawTitle(page, title, font1, brush1, (float) page.getClientSize().getWidth() / 2, y, alignment);y = y + 30;//段落文本String paragraph = "测试文字测试文字测试文字测试文字测试文字测试文字测试文字 " +"测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字 " +"测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字)";//在页面绘制段落PdfLayoutResult layoutResult = drawParagraph(page, paragraph,font2, brush2, x, y);y = y + (float) layoutResult.getBounds().getHeight() + 10;//加载一个图像文件PdfImage image = PdfImage.fromImage("C:\\Users\\Administrator\\Desktop\\th.jpg");//在页面绘制图像drawImage(page, image, x, y);y = y + (float) image.getPhysicalDimension().getHeight() + 10;//定义样本数据String[] data = {"第一列;第二列;第三列","a1;a2;a3","b1;b2;b3"};String[][] dataSource = new String[data.length][];for (int i = 0; i < data.length; i++) {dataSource[i] = data[i].split("[;]", -1);}//在页面绘制表格layoutResult = drawTable(page, dataSource, font2, x, y);y = y + (float) layoutResult.getBounds().getHeight() + 10;//创建一个顺序标记PdfOrderedMarker marker = new PdfOrderedMarker(PdfNumberStyle.Upper_Roman, new   PdfFont(PdfFontFamily.Helvetica, 12f, PdfFontStyle.Bold));//定义列表内容String listString = "e苹果\n香蕉\n葡萄\n柚子\n西瓜";//在页面绘制列表drawSortedList(page, listString, marker, font2, brush2, x, y, 10);//保存文件doc.saveToFile("CreatePdf.pdf");}}

生成的PDF文件如下所示。

Part6将PDF转换为其他格式

您可以直接通过saveToFile方法将生成的PDF(PdfDocument对象)保存为PDF文件,以及其他文件格式,如Doc,Docx,XPS,SVG和HTML。在下面的代码片段中,我会向您展示如何加载现有的PDF文档并进行文件格式转换。

//创建一个PdfDocument对象
PdfDocument doc = new PdfDocument();//加载现有的PDF文件
doc.loadFromFile("C:/Users/Administrator/Desktop/Input.pdf");//保存为Doc文件格式
doc.saveToFile("output/ToDoc.doc",FileFormat.DOC);//保存为Docx文件格式
doc.saveToFile("output/ToDocx.docx",FileFormat.DOCX);//保存为Html文件格式
doc.saveToFile("output/ToHtml.html",FileFormat.HTML);//保存为Xps文件格式
doc.saveToFile("output/ToXps.xps",FileFormat.XPS);//保存为Svg文件格式
doc.saveToFile("output/ToSvg.svg",FileFormat.SVG);

除了上面提到的文件格式,Spire.PDF还支持将PDF转换为普通的图像格式,如PNG,JPEG,EMF和TIFF。代码有点难度,但并不复杂。

//创建一个PdfDocument对象
PdfDocument doc = new PdfDocument();//加载现有的PDF文件
doc.loadFromFile("C:/Users/Administrator/Desktop/Input.pdf");//声明一个BufferedImage实例
BufferedImage image;//循环浏览PDF页面
for (int i = 0; i < doc.getPages().getCount(); i++) {//使用saveAsImage方法将每个页面保存为BufferedImage
image = doc.saveAsImage(i);//将BufferedImage保存为PNG文件格式File file = new File( String.format("ToImage-img-%d.png", i));ImageIO.write(image, "PNG", file);
}

以下是Free Spire.PDF支持的一些其他有用的功能列表。

Java添加页眉页脚到PDF

Java添加文本/图片水印到PDF

Java添加附件到PDF

Java添加图片/动态图章到 PDF

Java在PDF中应用不同的字体

Java填充PDF表单域

Java在PDF中添加表单域

Java在PDF中添加条形码

Java在PDF中添加形状

Java提取PDF文本内容/图片

Java加密和解密PDF

Java合并/拆分PDF文档

Java打印PDF文档

Part7总结

借助 Free Spire.PDF 提供的便于使用的API,您可以从头开始快速创建PDF文件并将PDF文件转换为其他文件格式,而无需花费大量学习时间。这对开发者来说无疑是一个好消息。无论您的项目是否需要PDF组件,无论您是高级程序员还是初级程序员,都欢迎您下载该类库并获得处理PDF文档的一些精彩体验。

BAT等大厂Java面试经验总结

想获取 Java大厂面试题学习资料

扫下方二维码回复「BAT」就好了

回复 【加群】获取github掘金交流群
回复 【电子书】获取2020电子书教程
回复 【C】获取全套C语言学习知识手册
回复 【Java】获取java相关的视频教程和资料
回复 【爬虫】获取SpringCloud相关多的学习资料
回复 【Python】即可获得Python基础到进阶的学习教程
回复 【idea破解】即可获得intellij idea相关的破解教程
关注我gitHub掘金,每天发掘一篇好项目,学习技术不迷路!
如果喜欢就给个“在看”

在Java程序中创建和转换PDF文件相关推荐

  1. Java实现pdf转tex_使用Free Spire.PDF在Java程序中创建和转换PDF文件

    在这篇文章中,我将举例说明如何创建一个包含标题,段落,图像,编号列表和表格的简单的PDF文件,以及如何使用Free Spire.PDF将PDF转换为其他文件格式. 概述 Free Spire.PDF ...

  2. linux中编辑pdf文件,如何在Ubuntu中创建和编辑PDF文件

    在打印,共享和通过电子邮件发送文档(尤其是大型文档)时,PDF或可移植文档格式通常是我们的首选.对于Windows和MacOS,您可能非常熟悉,也依赖于广泛使用的Acrobat产品来进行pdf创建,查 ...

  3. java 8 中文字体_在java程序中直接使用中文字体文件

    在java程序中直接使用中文字体文件.代码中的hb.ttf文件请用你自己的中文字体文件代替 java学习 java培训 软件工程师 如何学习java 学习java哪里好 东方清软java培训 清软国际 ...

  4. java swing 帮助文档,在Java Swing应用程序中创建在线帮助-使用pdf用户文档

    我正在尝试将一些用户文档链接到我的Java Swing应用程序.用户文档是pdf,我希望能够在应用程序中单击一个按钮,该按钮会打开某种pdf渲染器以显示我的userdoc.pdf. 我不想使用运行时e ...

  5. 如何在Java程序中调用Python算法脚本,重点讲Demo,不墨迹理论

    原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重. 前言 通过本篇,你将初步认识在Java程序中简单调用.py脚本文件的方法,附带入门的Demo实例讲解,更深入的理解还需要进一步学习. 最近 ...

  6. java 线程中创建线程_如何在Java 8中创建线程安全的ConcurrentHashSet?

    java 线程中创建线程 在JDK 8之前,还没有办法在Java中创建大型的线程安全的ConcurrentHashSet. java.util.concurrent包甚至没有一个名为Concurren ...

  7. 如何在Java 8中创建线程安全的ConcurrentHashSet?

    在JDK 8之前,还没有办法在Java中创建大型的线程安全的ConcurrentHashSet. java.util.concurrent包甚至没有一个名为ConcurrentHashSet的类,但是 ...

  8. java用redis缓存的步骤_详解在Java程序中运用Redis缓存对象的方法|chu

    这段时间一直有人问如何在Redis中缓存Java中的List 集合数据,其实很简单,常用的方式有两种: 1. 利用序列化,把对象序列化成二进制格式,Redis 提供了 相关API方法存储二进制,取数据 ...

  9. java 填充pdf_Java创建和填充PDF表单域方法

    表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加 ...

最新文章

  1. 2018-4-8使用兔子的例子对比说明遗传算法,局部搜索,禁忌搜索,模拟退火方法
  2. 一个springboot能支持多少并发_吃透这篇,你也能搭建出一个高并发和高性能的系统...
  3. 初识Mysql(part6)--我需要知道的4条Mysql语句之利用通配符过滤
  4. 玩转控件:封装Dev的LabelControl和TextEdit
  5. 数学家破解婚恋网站配对程序,90天找到灵魂伴侣
  6. tof摄像头手势识别_一种基于TOF手势识别的控制系统的制作方法
  7. Spring Boot笔记-发送消息给RabbitMQ
  8. 6 篇 2019 年最新模型剪枝技术合集
  9. Android doc |Getting Started|部分 部分译文 --Building Your First App
  10. 联姻寺库,一次半斤八两的合作,趣店的奢侈品生意仍看不见未来
  11. Oracle 11g系统自动收集统计信息的一些知识
  12. python的返回函数的作用_函数的返回值和作用域
  13. 贝叶斯概率推断(一):贝叶斯思维
  14. 信号与系统与数字信号处理丹梅老师公众号笔记
  15. 抢占氢能产业发展风口,上海重塑能源集团股份有限公司助推行业发展
  16. 微商公社新兵连第四天
  17. 面试留“家庭作业”的公司,都TM是耍流氓!
  18. LSTM调参经验(细读)
  19. PS选区工具和羽化的运用
  20. 数据分析学习笔记(二)数据分析三思维七技巧

热门文章

  1. 文件服务器切换,【原神】1.1版本PC端官服B服服务器切换教程
  2. 五一出行数据爬取分析-淄博(改)
  3. 培养孩子形成六大好习惯
  4. Scrapy 搜狗词库爬虫
  5. 阿里巴巴“38女王节”数据出炉:整体销售额较去年同比增长超100%
  6. “C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件
  7. postgres 基本postgis扩展将点生成线
  8. 【毕业季_进击的技术er】送别过去两年迷茫的自己。重整旗鼓,大三我来啦
  9. win7虚拟计算机名,Win7笔记本电脑启用虚拟wifi共享上网(图文介绍)
  10. 【触手可及,用完即走】