Java

1、概述

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

2、准备工作

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文件。

3、坐标系

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

  • 坐标系的原点(0,0)即内容区域的左上角顶点。
  • X轴向右延伸,Y轴向下延伸。

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

4、创建自定义函数

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

drawTitle

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

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

drawParagraph

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

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

drawImage

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

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

drawTable

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

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

drawSortedList

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

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

5、使用的代码

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

  1. import com.spire.pdf.PdfDocument;
  2. import com.spire.pdf.PdfNumberStyle;
  3. import com.spire.pdf.PdfPageBase;
  4. import com.spire.pdf.graphics.*;
  5. import com.spire.pdf.lists.*;
  6. import com.spire.pdf.tables.PdfTable;
  7. import java.awt.*;
  8. import java.awt.geom.Point2D;
  9. import java.awt.geom.Rectangle2D;
  10. public class CreatePdf {
  11. public static void main(String[] args) {
  12. //创建一个PdfDocument对象
  13. PdfDocument doc = new PdfDocument();
  14. //添加页面
  15. PdfPageBase page = doc.getPages().add();
  16. //创建两个纯色笔刷
  17. PdfSolidBrush brush1 = new PdfSolidBrush(new PdfRGBColor(Color.BLUE));
  18. PdfSolidBrush brush2 = new PdfSolidBrush(new PdfRGBColor(Color.BLACK));
  19. //创建两种字体
  20. PdfTrueTypeFont font1 = new PdfTrueTypeFont(new Font("Arial Unicode MS",
  21. Font.PLAIN, 14), true);
  22. PdfTrueTypeFont font2 = new PdfTrueTypeFont(new Font("Arial Unicode MS",
  23. Font.PLAIN, 10), true);
  24. //初始化X轴和Y轴坐标
  25. float x = 0;
  26. float y = 0;
  27. //题目
  28. String title = "题目";
  29. //通过PdfTextAlignment类库将文本居中对齐
  30. PdfTextAlignment alignment = PdfTextAlignment.Center;
  31. //在文档中心绘制标题
  32. drawTitle(page, title, font1, brush1, (float) page.getClientSize().getWidth() / 2, y,
  33. alignment);
  34. y = y + 30;
  35. //段落文本
  36. String paragraph = "测试文字测试文字测试文字测试文字测试文字测试文字测试文字 " +
  37. "测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字 " +
  38. "测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字)";
  39. //在页面绘制段落
  40. PdfLayoutResult layoutResult = drawParagraph(page, paragraph,font2, brush2, x, y);
  41. y = y + (float) layoutResult.getBounds().getHeight() + 10;
  42. //加载一个图像文件
  43. PdfImage image = PdfImage.fromImage("C:\\Users\\Administrator\\Desktop\\th.jpg");
  44. //在页面绘制图像
  45. drawImage(page, image, x, y);
  46. y = y + (float) image.getPhysicalDimension().getHeight() + 10;
  47. //定义样本数据
  48. String[] data = {"第一列;第二列;第三列",
  49. "a1;a2;a3",
  50. "b1;b2;b3"};
  51. String[][] dataSource = new String[data.length][];
  52. for (int i = 0; i < data.length; i++) {
  53. dataSource[i] = data[i].split("[;]", -1);
  54. }
  55. //在页面绘制表格
  56. layoutResult = drawTable(page, dataSource, font2, x, y);
  57. y = y + (float) layoutResult.getBounds().getHeight() + 10;
  58. //创建一个顺序标记
  59. PdfOrderedMarker marker = new PdfOrderedMarker(PdfNumberStyle.Upper_Roman, new
  60. PdfFont(PdfFontFamily.Helvetica, 12f, PdfFontStyle.Bold));
  61. //定义列表内容
  62. String listString = "e苹果\n香蕉\n葡萄\n柚子\n西瓜";
  63. //在页面绘制列表
  64. drawSortedList(page, listString, marker, font2, brush2, x, y, 10);
  65. //保存文件
  66. doc.saveToFile("CreatePdf.pdf");
  67. }
  68. }

生成的PDF文件如下所示。

在Java程序中创建和转换PDF文件 - 图2

6、将PDF转换为其他格式

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

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

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

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

以下是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文档

7、总结

借助 Free Spire.PDF 提供的便于使用的API,可以从头开始快速创建PDF文件并将PDF文件转换为其他文件格式,而无需花费大量学习时间。