1、使用 spire.pdf for java
Free Spire.PDF for Java 是一个 100% 免费的 PDF API, 专门对 PDF 文档进行操作的 Java 类库。该类库的主要功能在于帮助开发人员在 Java 应用程序(J2SE和J2EE)中生成 PDF 文档和操作现有 PDF 文档,并且运行环境无需安装 Adobe Acrobat。
Free Spire.PDF for Java 支持的功能非常丰富,例如 PDF 文档安全性设置,提取文本和图片,合并和拆分 PDF,画文本、图片、形状、条形码到 PDF,创建和填充表单,添加和删除层,重叠 PDF 页面,添加文本/图片水印,添加、更新、删除 PDF 书签,添加表格,压缩 PDF 文档等。此外,Spire.PDF for Java 还支持将 PDF 文档高质量地转换为 Word、HTML、XPS、图片、SVG 和 PDF/A 格式,以及将 XPS 文档高质量地转换为 PDF 格式。
友情提示: 免费版有 10 页的页数输出限制,在输出结果文档时只能输出前 10 页。将 PDF 文档转换为图片、Word、HTML、XPS 等格式时,仅支持转换前 3 页。如超出限制,可升级到商业版,我们仅对免费版进行不定期维护。
安装 Spire.PDF for Java
首先,您需要在 Java 程序中添加 Spire.Pdf.jar 文件作为依赖项。JAR 文件可以从此链接下载。 如果您使用 Maven,则可以将以下代码添加到项目的 pom.xml 文件中,从而轻松地在应用程序中导入 JAR 文件
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>5.2.3</version>
</dependency>
</dependencies>
下载插件
此场景还依赖于 QT Web 引擎,它是一个提供渲染 HTML 内容的功能的开源库。请从以下链接下载适合您的操作系统的插件。
在磁盘上的某个位置解压缩包以获取 “Plugins” 文件夹。在本例中,我们将插件保存在路径 “F:\Libraries\plugins-windows-x64\plugins” 下。
对于 Linux 和 Mac 环境,请直接将插件包拷贝到 Linux 或 Mac 系统上解压缩,并确保解压后的文件夹有权限进行读取。
请注意:该转换方法需要 GUI(图形用户界面)的支持。对于未安装图形用户界面的服务器,请按照以下步骤进行转换。
-
安装 Xvfb
Centos 系统:yum install Xvfb
Ubuntu 系统:apt-get install Xvfb
-
使用 xvfb-run 运行 jar 包
xvfb-run java -jar HTMLToPDF.jar
将 URL 转换为 PDF
以下是使用 Spire.PDF for Java 以及 QT 插件将 URL 转换为 PDF 文档的步骤。
- 指定要转换的 URL 路径。
- 指定输出文件路径。
- 指定插件路径,并将其作为 HtmlConvert.setPluginPath() 方法的参数传递。
- 调用 HtmlConverter.convert (String url, String fileName, boolean enableJavaScript, int timeout, com.spire.pdf.htmlconverter.qt.Size pageSize, com.spire.pdf.graphics.PdfMargins margins) 方法将 URL 转换为 PDF。
import com.spire.pdf.graphics.PdfMargins;
import com.spire.pdf.htmlconverter.qt.HtmlConverter;
import com.spire.pdf.htmlconverter.qt.Size;
public class ConvertUrlToPdf {
public static void main(String[] args) {
//指定URL路径
String url = "https://www.baidu.com/";
//指定输出文档路径
String fileName = "output/UrlToPdf.pdf";
//指定插件路径
String pluginPath = "F:\Libraries\plugins-windows-x64\plugins";
//设置插件路径
HtmlConverter.setPluginPath(pluginPath);
//将URL转换为PDF
HtmlConverter.convert(url, fileName, true, 1000000, new Size(1200f, 1000f), new PdfMargins(0));
}
}
2、使用 itextpdf
-
使用 freemark 来渲染 html
-
使用 itextpdf根据 html 来生成 pdf
添加依赖
<properties>
<itext.version>7.1.2</itext.version>
<java.version>1.8</java.version>
</properties>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>font-asian</artifactId>
<version>${itext.version}</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>barcodes</artifactId>
<version>${itext.version}</version>
</dependency>
代码如下:
public void toPdf(String htmlContent, String dest) throws FileNotFoundException, IOException {
ConverterProperties props = new ConverterProperties();
DefaultFontProvider defaultFontProvider = new DefaultFontProvider(false,
false, false);
String FONT = emailTemplate + File.separatorChar + "NotoSansCJKsc-Regular.otf";
defaultFontProvider.addFont(FONT);
props.setFontProvider(defaultFontProvider);
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
pdf.setDefaultPageSize(new PageSize(960, 14400));
Document document = HtmlConverter.convertToDocument(htmlContent, pdf, props);
// 将所有内容在一个页面显示
EndPosition endPosition = new EndPosition();
LineSeparator separator = new LineSeparator(endPosition);
document.add(separator);
document.getRenderer().close();
PdfPage page = pdf.getPage(1);
float y = endPosition.getY() - 36;
page.setMediaBox(new Rectangle(0, y, 960, 14400 - y));
document.close();
pdf.close();
}
class EndPosition implements ILineDrawer {
/** A Y-position. */
protected float y;
/**
* Gets the Y-position.
*
* @return the Y-position
*/
public float getY() {
return y;
}
/*
* (non-Javadoc)
*
* @see
* com.itextpdf.kernel.pdf.canvas.draw.ILineDrawer#draw(com.itextpdf.kernel.pdf.
* canvas.PdfCanvas, com.itextpdf.kernel.geom.Rectangle)
*/
@Override
public void draw(PdfCanvas pdfCanvas, Rectangle rect) {
this.y = rect.getY();
}
/*
* (non-Javadoc)
*
* @see com.itextpdf.kernel.pdf.canvas.draw.ILineDrawer#getColor()
*/
@Override
public Color getColor() {
return null;
}
/*
* (non-Javadoc)
*
* @see com.itextpdf.kernel.pdf.canvas.draw.ILineDrawer#getLineWidth()
*/
@Override
public float getLineWidth() {
return 0;
}
/*
* (non-Javadoc)
*
* @see
* com.itextpdf.kernel.pdf.canvas.draw.ILineDrawer#setColor(com.itextpdf.kernel.
* color.Color)
*/
@Override
public void setColor(Color color) {
}
/*
* (non-Javadoc)
*
* @see com.itextpdf.kernel.pdf.canvas.draw.ILineDrawer#setLineWidth(float)
*/
@Override
public void setLineWidth(float lineWidth) {
}
}
总结
-
使用 spire.pdf for java 可以实现 更复杂的 html 转为 pdf 的处理,封装的比较深,用户可处理的比较少。对页面的还原度好,对于有图片的,会加水印,有页数限制。生成的速度慢。
-
使用 itextpdf 根据html 生成pdf 对于样式的的支持没有 spire.pdf 好。但是生成的速度快。