开发中业务操作相关的记录-在Java程序中创建和转换PDF文件-《Java笔记》

admin 2025-10-19 03:22:02 编程 来源:ZONE.CI 全球网 0 阅读模式

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轴向下延伸。

4、创建自定义函数

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

drawTitle

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

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

drawParagraph

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

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

drawImage

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

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

drawTable

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

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

drawSortedList

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

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

5、使用的代码

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

import%20com.spire.pdf.PdfDocument;import%20com.spire.pdf.PdfNumberStyle;import%20com.spire.pdf.PdfPageBase;import%20com.spire.pdf.graphics.*;import%20com.spire.pdf.lists.*;import%20com.spire.pdf.tables.PdfTable;import%20java.awt.*;import%20java.awt.geom.Point2D;import%20java.awt.geom.Rectangle2D;public%20class%20CreatePdf%20{%20%20%20%20public%20static%20void%20main(String[]%20args)%20{%20%20%20%20%20%20%20%20//创建一个PdfDocument对象%20%20%20%20%20%20%20%20PdfDocument%20doc%20=%20new%20PdfDocument();%20%20%20%20%20%20%20%20//添加页面%20%20%20%20%20%20%20%20PdfPageBase%20page%20=%20doc.getPages().add();%20%20%20%20%20%20%20%20//创建两个纯色笔刷%20%20%20%20%20%20%20%20PdfSolidBrush%20brush1%20=%20new%20PdfSolidBrush(new%20PdfRGBColor(Color.BLUE));%20%20%20%20%20%20%20%20PdfSolidBrush%20brush2%20=%20new%20PdfSolidBrush(new%20PdfRGBColor(Color.BLACK));%20%20%20%20%20%20%20%20//创建两种字体%20%20%20%20%20%20%20%20PdfTrueTypeFont%20font1%20=%20new%20PdfTrueTypeFont(new%20Font("Arial%20Unicode%20MS",%20%20%20%20%20%20%20%20%20Font.PLAIN,%20%2014),%20true);%20%20%20%20%20%20%20%20PdfTrueTypeFont%20font2%20=%20new%20PdfTrueTypeFont(new%20Font("Arial%20Unicode%20MS",%20%20%20%20%20%20%20%20%20Font.PLAIN,%2010),%20true);%20%20%20%20%20%20%20%20//初始化X轴和Y轴坐标%20%20%20%20%20%20%20%20float%20x%20=%200;%20%20%20%20%20%20%20%20float%20y%20=%200;%20%20%20%20%20%20%20%20//题目%20%20%20%20%20%20%20%20String%20title%20=%20"题目";%20%20%20%20%20%20%20%20//通过PdfTextAlignment类库将文本居中对齐%20%20%20%20%20%20%20%20PdfTextAlignment%20alignment%20=%20PdfTextAlignment.Center;%20%20%20%20%20%20%20%20//在文档中心绘制标题%20%20%20%20%20%20%20%20drawTitle(page,%20title,%20font1,%20brush1,%20(float)%20page.getClientSize().getWidth()%20/%202,%20y,%20%20%20%20%20%20%20%20%20alignment);%20%20%20%20%20%20%20%20y%20=%20y%20+%2030;%20%20%20%20%20%20%20%20//段落文本%20%20%20%20%20%20%20%20String%20paragraph%20=%20"测试文字测试文字测试文字测试文字测试文字测试文字测试文字%20"%20+%20%20%20%20%20%20%20%20"测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字%20"%20+%20%20%20%20%20%20%20%20"测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字)";%20%20%20%20%20%20%20%20//在页面绘制段落%20%20%20%20%20%20%20%20PdfLayoutResult%20layoutResult%20=%20drawParagraph(page,%20paragraph,font2,%20brush2,%20x,%20y);%20%20%20%20%20%20%20%20y%20=%20y%20+%20(float)%20layoutResult.getBounds().getHeight()%20+%2010;%20%20%20%20%20%20%20%20//加载一个图像文件%20%20%20%20%20%20%20%20PdfImage%20image%20=%20PdfImage.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文件如下所示。

    6、将PDF转换为其他格式

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

    //创建一个PdfDocument对象PdfDocument%20doc%20=%20new%20PdfDocument();//加载现有的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%20doc%20=%20new%20PdfDocument();//加载现有的PDF文件doc.loadFromFile("C:/Users/Administrator/Desktop/Input.pdf");//声明一个BufferedImage实例BufferedImage%20image;//循环浏览PDF页面for%20(int%20i%20=%200;%20i%20<%20doc.getPages().getCount();%20i++)%20{%20%20//使用saveAsImage方法将每个页面保存为BufferedImage%20%20image%20=%20doc.saveAsImage(i);%20%20//将BufferedImage保存为PNG文件格式%20%20File%20file%20=%20new%20File(%20String.format("ToImage-img-%d.png", i));
  • ImageIO.write(image, "PNG", file);
  • }
  • 以下是Free Spire.PDF支持的一些其他有用的功能列表。Java添加页眉页脚到PDFJava添加文本/图片水印到PDFJava添加附件到PDFJava添加图片/动态图章到 PDFJava在PDF中应用不同的字体Java填充PDF表单域Java在PDF中添加表单域Java在PDF中添加条形码Java在PDF中添加形状Java提取PDF文本内容/图片Java加密和解密PDFJava合并/拆分PDF文档Java打印PDF文档

    7、总结

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

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  4