itext7 html转pdf 图片宽高
1. 简介
iText是一个Java的PDF库,可以用于创建、修改和提取PDF文档。iText7是其最新版本,在生成PDF文件时非常强大而灵活。本文将详细介绍如何使用iText7将HTML文件转换为PDF,并控制图片的宽度和高度。
2. 准备工作
在开始之前,我们需要准备以下工作:
- iText7的jar文件(可以从官方网站下载)
- JDK的安装和配置
- 一个HTML文件,其中包含需要转换的内容和图片
3. 导入依赖
首先,我们需要将iText7的jar文件导入我们的项目中。可以在Maven或者Gradle中添加依赖项,也可以直接将jar文件复制到项目的lib文件夹中。
4. 创建一个简单的HTML文件
我们先创建一个简单的HTML文件作为示例,并包含一张图片。例如,我们创建一个名为example.html的文件,内容如下:
<!DOCTYPE html>
<html>
<head>
<title>Example HTML</title>
</head>
<body>
<h1>Hello, world!</h1>
<img src="example.jpg" alt="Example Image">
</body>
</html>
请确保图片example.jpg与HTML文件在同一目录下。
5. 创建一个PDF文件并将HTML内容添加到PDF中
现在我们将使用iText7创建一个PDF文件,并将HTML文件中的内容添加到PDF中。
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class HtmlToPdfConverter {
public static void main(String[] args) {
String htmlFile = "example.html";
String pdfFile = "example.pdf";
try {
// 创建文件输入流和输出流
FileInputStream htmlInput = new FileInputStream(htmlFile);
FileOutputStream pdfOutput = new FileOutputStream(pdfFile);
// 创建转换属性对象
ConverterProperties properties = new ConverterProperties();
// 将HTML转换为PDF
HtmlConverter.convertToPdf(htmlInput, pdfOutput, properties);
// 关闭输入和输出流
htmlInput.close();
pdfOutput.close();
System.out.println("PDF转换完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述代码使用HtmlConverter.convertToPdf
方法将HTML文件转换为PDF,并将结果保存到pdfOutput输出流中。请确保example.html文件与图片example.jpg在同一目录下。
6. 控制图片的宽度和高度
有时候,我们希望能够控制PDF中图片的宽度和高度。iText7提供了一个imgTagWorkerFactory
用于自定义图片标签的处理器,在这个处理器中可以设置图片的宽度和高度。
以下是一个示例代码,演示如何设置图片的宽度和高度:
import com.itextpdf.html2pdf.attachment.Attachment;
import com.itextpdf.html2pdf.attach.impl.tags.ImageTagWorker;
import com.itextpdf.layout.IPropertyContainer;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.property.UnitValue;
import org.jsoup.nodes.Element;
public class CustomImageTagWorkerFactory extends ImageTagWorkerFactory {
// 重写createTagWorker方法
@Override
public ITagWorker createTagWorker(IElementNode tag, ProcessorContext context) {
if ("img".equalsIgnoreCase(tag.name())) {
return new CustomImageTagWorker(tag, context);
}
return super.createTagWorker(tag, context);
}
}
class CustomImageTagWorker extends ImageTagWorker {
public CustomImageTagWorker(IElementNode element, ProcessorContext context) {
super(element, context);
}
@Override
public void processEnd(IElementNode element, ProcessorContext context) {
super.processEnd(element, context);
Image image = (Image) getElements().get(0);
Element imgElement = element.element();
// 从属性中获取宽度和高度的值
String width = imgElement.attr("width");
String height = imgElement.attr("height");
// 如果宽度或高度属性存在,则设置图片的宽度和高度
if (!width.isEmpty()) {
image.setWidth(UnitValue.createPointValue(Float.parseFloat(width)));
}
if (!height.isEmpty()) {
image.setHeight(UnitValue.createPointValue(Float.parseFloat(height)));
}
}
}
在上述代码中,我们自定义了一个CustomImageTagWorkerFactory
类,并重写了createTagWorker
方法来创建自定义的图片标签处理器。在CustomImageTagWorker
类中,我们重写了processEnd
方法来设置图片的宽度和高度。
要在转换HTML到PDF的过程中使用这个自定义类,我们需要在转换属性中设置。修改我们的主类:
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.styledxmlparser.config.impl.DefaultTagWorkerFactory;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class HtmlToPdfConverter {
public static void main(String[] args) {
String htmlFile = "example.html";
String pdfFile = "example.pdf";
try {
// 创建文件输入流和输出流
FileInputStream htmlInput = new FileInputStream(htmlFile);
FileOutputStream pdfOutput = new FileOutputStream(pdfFile);
// 创建转换属性对象,并设置自定义图片标签处理器
ConverterProperties properties = new ConverterProperties();
properties.setTagWorkerFactory(new CustomImageTagWorkerFactory());
// 将HTML转换为PDF
HtmlConverter.convertToPdf(htmlInput, pdfOutput, properties);
// 关闭输入和输出流
htmlInput.close();
pdfOutput.close();
System.out.println("PDF转换完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上述代码中,我们通过properties.setTagWorkerFactory(new CustomImageTagWorkerFactory())
来设置自定义图片标签处理器。
7. 运行代码并查看结果
我们可以运行代码查看生成的PDF文件是否符合预期。运行代码后,将在项目目录下生成一个名为example.pdf的PDF文件。
在生成的PDF中,图片的宽度和高度将会根据HTML文件中的设置进行调整。