第1章:Hello HTML转PDF

本章详细介绍了如何使用iText将简单的HTML文件转换为PDF文档,包括不同方式的转换方法,如字符串、文件路径等,并展示了如何处理图像、设置基URI,以及转换为iText对象的步骤。

在本章中,我们将以多种不同的方式将简单的HTML文件转换为PDF文档。HTML文件的内容将由“Test”标题、“Hello World”段落和表示iText徽标的图像组成。

示例的结构

本书中的所有示例都具有类似的结构。

输入:

对于输入,我们将提供HTML语法。在本教程中,我们将使用HTML字符串、HTML文件的路径,或者在第4章中,使用XML文件的路径以及XSLT文件的路径将XML转换为HTML。

在第一个示例中,C01E01_HelloWorld.java,HTML以字符串形式提供:

public String HTML = "TestHello World";

在其他示例中,例如 C01E03_HelloWorld.java,我们将使用两个常量:

  • BASEURI常量,用于指向父文件夹的路径,父文件夹用于查找源HTML和资源(如图像和CSS),以及

  • 带有该源HTML文件路径的SRC常量。

例如:

public static String BASEURI = "src/main/resources/html/"; 
public static String SRC = String.format("%shello.html", BASEURI);

输出:

我们将为输出使用类似的结构:

  • 一个 TARGET 常数,用于我们将结果PDF写入的文件夹的路径,以及

  • 带有该 PDF 路径的 DEST 常量。

public static String TARGET = "target/results/ch01/"; public static String DEST = String.format("%stest-03.pdf", TARGET);

主方法:

本书中所有示例的主方法与第一个示例的方法没有太大区别:

public static void main(String[] args) throws IOException {    
   LicenseKey.loadLicenseFile(System.getenv("ITEXT7_LICENSEKEY") + "/itextkey-html2pdf_typography.xml");    
   File file = new File(TARGET); 
   file.mkdirs();
   new C01E01_HelloWorld().createPdf(HTML, DEST); 
}

首先,我们加载iText许可证文件。这是一个XML文件,包含用于使用iText的许可证密钥。如果在AGPL项目的上下文中使用iText和pdfHTML,则可能不需要此许可证密钥。然而,对于第6章中的国际化示例,您将需要 pdfCalligraph 插件,而pdfCalligraph 插件在AGPL下不可用;它只是一个封闭源代码的插件。

我们在本书示例中使用的许可证密钥与您购买商业许可证在封闭源代码环境中使用iText 7、pdfHTML和pdfCalligraph时获得的密钥类似。

然后我们创建目标目录,以防它还不存在,然后是createPdf()/createPdf()方法。我们可以用许多不同的方式实现这种方法。

将HTML转换为PDF

C01E01_HelloWorld.java 的 createPdf()/createPdf()方法的实现。java示例非常简单。其主体由一条线组成:

public void createPdf(String html, String dest) throws IOException {             
    HtmlConverter.convertToPdf(html, new FileOutputStream(dest)); 
}

HtmlConverter对象可以选择不同的静态convertToPdf()/convertToPdf()方法,这些方法根据用例采用不同的参数。在第一个示例中,第一个参数html是具有以下值的字符串:

public static String HTML = "<h1>Test</h1><p>Hello World</p>";

这个HTML片段转换成PDF文档如下图所示:

图1.1:将HTML片段转换为PDF

让我们介绍一个图像,并使用以下字符串:

public static String HTML = "<h1>Test</h1><p>Hello World</p><img src=\"img/logo.png\">";

此HTML片段包含到图像文件徽标的相对链接。png位于名为img的子目录中。iText无法猜测在何处查找此子目录,因此我们将为转换过程配置基本URI。

这是使用ConverterProperty(Java/.NET)对象完成的,如 C01E02_HelloWorld.java 示例的createPdf()/createPdf()方法所示。

public void createPdf(String baseUri, String html, String dest) throws IOException { 
     ConverterProperties properties = new ConverterProperties();     
     properties.setBaseUri(baseUri);
     HtmlConverter.convertToPdf(html, new FileOutputStream(dest), properties);
}

我们创建了一个converterproperty(Java/.NET)对象,并将基URI设置为img目录的父目录,iText可以在其中找到徽标。png文件。

图1.2 显示了结果。

图1.2:将包含引用的HTML片段转换为图像

在下面的大多数示例中,我们不会使用存储在字符串中的HTML。相反,我们将把磁盘上的HTML文件转换为磁盘上的文件。

在本章剩下的示例中,我们将使用名为hello的文件。html如图1.3所示。

图1.3:Hello.html 在浏览器和文本编辑器中显示的 html

有不同的方法将此文件转换为PDF文档。

在 C01E03_HelloWorld.java 示例中,我们使用文件/文件信息对象:

public void createPdf(String baseUri, String src, String dest) throws IOException {
     HtmlConverter.convertToPdf(new File(src), new File(dest)); 
}

convertToPdf()/convertToPdf()方法的第一个参数是指源HTML文件,第二个参数是指目标PDF文件。在这种情况下,我们不需要设置任何转换器属性。默认情况下,iText将使用此文件的父目录作为基本URI。

这不适用于C01E04_ HelloWorld.java。我们使用FileInputStream/FileStream和FileOutputStream/FileStream对象而不是File/FileInfo对象的java示例:

public void createPdf(String baseUri, String src, String dest) throws IOException {
     ConverterProperties properties = new ConverterProperties();
     properties.setBaseUri(baseUri);
     HtmlConverter.convertToPdf(
         new FileInputStream(src), new FileOutputStream(dest), properties); 
}

这里无法检索父级,因此我们需要使用ConverterProperty(Java/.NET)实例将基URI传递给转换器。第三个和第四个示例的结果PDF看起来与图1.2中所示的第二个示例的结果PDF相同。第五个例子的PDF也是如此,C01E05_HelloWorld.java:

public void createPdf(String baseUri, String src, String dest) throws IOException {
     ConverterProperties properties = new ConverterProperties();
     properties.setBaseUri(baseUri);
     PdfWriter writer = new PdfWriter(dest,
         new WriterProperties().setFullCompressionMode(true));
     HtmlConverter.convertToPdf(new FileInputStream(src), writer, properties); 
}

在本例中,我们使用PdfWriter(Java/.NET)实例,而不是FileOutputStream/FileStream。如果您想设置某些writer属性,使用PdfWriter(Java/.NET)可能很有用。

有关writer属性的更多信息,请阅读iText 7:构建块Java教程(第7章),题为“处理事件;设置查看器首选项和打印机属性”

在本例中,我们以完全压缩模式创建PDF。在人眼看来,生成的PDF看起来是相同的,但当你将示例4中生成的PDF的文件大小与本示例中生成的PDF的文件大小进行比较时,你会发现完全压缩为我们赢得了少量字节。

图1.4显示了在PDF 1.0到PDF 1.4中使用压缩时的3430字节;然而,当使用PDF 1.5中介绍的压缩时,该文件仅统计3263字节。这种差异似乎很小,但PDF中的对象越多,使用完全压缩就越有意义。

图1.4:比较文件大小

在 C01E06_HelloWorld.java 示例中。例如,我们用PdfDocument(java/.NET)参数替换了PdfWriter(java/.NET)参数。

public void createPdf(String baseUri, String src, String dest) throws IOException {
     ConverterProperties properties = new ConverterProperties();
     properties.setBaseUri(baseUri);
     PdfWriter writer = new PdfWriter(dest);
     PdfDocument pdf = new PdfDocument(writer);
     pdf.setTagged();
     HtmlConverter.convertToPdf(new FileInputStream(src), pdf, properties); 
}

如果您想在PdfDocument(Java/.NET)级别配置功能,那么使用PdfDocument(Java/.NET)实例是有意义的。在本例中,我们引入了pdf行 pdf.setTagged()/pdf.SetTagged(),指示iText创建带标记的PDF。

图1.5显示了打开标记面板后生成的PDF。

图1.5:创建带标签的PDF

在标记面板上创建标记的 PDFLooking,您可以看到内容的结构。当鼠标悬停在图像上时,您会看到<img>标签的alt属性值作为工具提示。

有关带标签PDF的更多信息,请阅读iText 7:跳转入门教程(第7章),题为“创建PDF/UA和PDF/A文档”

在第3章中,我们将深入探讨带标签的PDF并使PDF“可访问”。

将HTML转换为iText对象

convertToPdf()/convertToPdf()方法创建一个完整的PDF文件。解析输入并将其转换为PDF后,将关闭传递给convertToPdf()/convertToPdf()方法的任何文件、FileInfo、OutputStream、PdfWriter(Java/.NET)或PdfDocument(Java/.NET)。这可能并不总是你想要的。

在某些情况下,您希望向文档(Java/.NET)中添加一些额外信息,或者您可能不希望将HTML转换为PDF文件,而是转换为一系列可用于不同目的的iText对象。这就是convertToDocument()/convertToDocument()和convertToElements()/convertToElements()方法的内容。

在 C01E07_HelloWorld中.java 示例,我们将Hello World HTML转换为文档(java/.NET),因为我们想在解析完HTML后添加一些额外的内容:

public void createPdf(String baseUri, String src, String dest) throws IOException {
     ConverterProperties properties = new ConverterProperties();
     properties.setBaseUri(baseUri);
     PdfWriter writer = new PdfWriter(dest);
     PdfDocument pdf = new PdfDocument(writer);
     Document document =
         HtmlConverter.convertToDocument(new FileInputStream(src), pdf, properties);
     document.add(new Paragraph("Goodbye!"));
     document.close(); 
}

convertToDocument()/convertToDocument()方法返回一个iText文档(Java/.NET)实例。我们使用这个文档(Java/.NET)实例来添加一些额外的内容(“再见!”)解析HTML后。

图1.6:使用convertToDocument()方法

通过将HTML解析为PDF,添加了图1.6中内容的上部;下半部分-再见最后–使用document.add()/document.Add()指令。

在 C01E08_HelloWorld.java 示例中,我们使用 convertToElements()/convertToElements() 方法。此方法创建 IElement 对象列表。IElement接口由所有iText构建块实现。

有关iText构建块的更多信息,请阅读iText 7:构建块教程。

第1章的最后一个示例将List/IElement>/IList集合的每个顶级对象添加到文档(Java/.NET)中,前面有一段显示该对象的名称:

public void createPdf(String baseUri, String src, String dest) throws IOException {
     ConverterProperties properties = new ConverterProperties();
     properties.setBaseUri(baseUri);
     List<IElement> elements = 
        HtmlConverter.convertToElements(new FileInputStream(src), properties);
     PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
     Document document = new Document(pdf);
     for (IElement element : elements) {
         document.add(new Paragraph(element.getClass().getName()));
         document.add((IBlockElement)element);
     }
     document.close(); 
}

查看图1.7,我们看到该列表由三个元素组成:一个Div和两个段落(Java/.NET)对象。

图1.7:一次添加一个元素

标题被视为Div,而徽标图像被包装在段落(Java/.NET)中。别担心这个;这是iText内部工作的一部分。重要的是最终结果。

总结

在本章中,我们选取了一个非常简单的HTML文件,并使用转换方法convertToPdf()/convertToPdf(),convertToDocument()/convertToDocument()和convertToElements()/convertToElements()的不同实现将该文件转换为PDF。当您查阅 HtmlConverter 类(Java/.NET)的API文档时,您会发现这些方法有更多的变体。在下一章中,我们将选择其中一种方法来转换不同的HTML文件。每个HTML文件都将以不同的方式使用CSS。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晶格点阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值