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

概述

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

准备工作

从此链接下载Free Spire.PDF for Java,并在您的Java项目中导入Spire.Pdf.jar文件。

坐标系

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

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

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

1.png

创建自定义函数

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;

}

使用的代码

调用这些自定义函数,您将能够在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文件如下所示。

2.png

将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支持的一些其他有用的功能列表。

总结

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

如果您有任何疑问,请随时在下方发表评论或通过support@e-iceblue.com与我们联系。

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

  1. 在Java程序中创建和转换PDF文件

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 作者: Codingqi123 来源: jianshu.com/p/db15232987 ...

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

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

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

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

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

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

  5. java调用excel在页面生成饼状图_Java 在 Excel 中创建饼图/环形图

    饼图 是 Excel中常见的一种圆饼形图表工具 ,它 能够直接以图形的方式 展现 各个组成部分 在整体中 所 占 的比例,从而帮助 我们更加快速直观的去分析和理解抽象的数据.而环形图 则 是饼图的一种 ...

  6. java创建临时文件夹_如何在Java中创建一个临时目录/文件夹?

    有没有在Java应用程序内部创建临时目录的标准可靠方法? Java的问题数据库中有一个条目,注释中包含一些代码,但是我想知道在一个常用的库(Apache Commons等)中是否找到标准解决方案? # ...

  7. glade java_如何在Java Gnome / GTK程序中使用Glade UI(.glade文件)?

    我在互联网上做了一项研究,寻找教程/文档来解释如何在Java Gnome项目中使用Glade中设计的UI,但没有运气.我已经知道如何使用Java Gnome / GTK从代码创建UI.无论如何,我想使 ...

  8. java beans 组件_如何利用JavaBeans在应用程序中创建组件?

    JavaBeans模块使开发人员能够创建称之为组件的软件单元(也就是我们熟知的beans).你可以把beans加载在更复杂的组件.Java小型应用程序(applets)或应用程序上.JavaBeans ...

  9. java socket 判断是否断开_Linux Socket:如何在客户端程序中检测断开的网络?

    仅在调用write()函数时才能检测到未插入的以太网电缆 . 这是因为tcp堆栈的tcp重传没有你的意识 . 这是解决方案 . 即使您已经为应用程序套接字设置了keepalive选项,但是如果您的应用 ...

最新文章

  1. axure怎样24位bmp输出_平衡(非平衡)输入输出的无源变压器前级放大器
  2. 实战解析:真实AI场景下,极小目标检测与精度提升 | 百度AI公开课
  3. excel图片变成代码_三行代码把女朋友照片变成了素描图片!以为我画的!爱我爱的不行...
  4. Tomcat定义虚拟主机案例
  5. CentOS_7 安装MySql5.7
  6. 漫步数理统计十七——条件分布与期望
  7. 人工智能+教育的应用——教育的安全
  8. 该怎么输出log?!
  9. moonmq: 用go实现的高性能message queue
  10. 深度学习图像分类(四): GoogLeNet(V1,V2,V3,V4)
  11. 《企业IT架构转型之道》阿里巴巴中台战略思想和架构实战-书摘整理
  12. 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
  13. 注塑行业APS解决方案
  14. 未受信任的企业级开发者_在 iOS 上安装自定企业级应用
  15. mysql三表联查sql语句_SQL三表连接查询与集合的并、交、差运算查询
  16. 随手记录: 扩展M.2硬盘,从1T换到2T 硬盘clone ubuntu设置等注意事项
  17. Treeview 无限分类非递归终极解决方案VB
  18. spring boot rest例子
  19. 4.页面评价算法 Heritrix应用与扩展
  20. 《沧浪之水》、《因为女人》作者阎真的最新作品《活着之上》的阅后笔记

热门文章

  1. 博弈论——最后通牒与讨价还价
  2. JSON Schema校验数据
  3. [吐槽][mellanox]RoCE的默认打开;rdma-core
  4. 非科班出身,工作 10 年,我从 2800 到如今年薪 200 万
  5. ios 绘制线框_iOS使用Charts框架绘制折线图
  6. Oracle数据库主键自增的两种方式(SEQUENCE和触发器)
  7. 【维生素C语言】第十七章 - C语言预处理(上)
  8. MindManager永久激活码试用版安装
  9. jquery实现根据id给input赋值
  10. iMX6Ull采用Yocto构建嵌入式Linux系统(三)