我会避免这样的结构:
PdfFont fontRegular = FindFontInForm(pdf, new PdfName("OpenSans"));
Style regular = new Style();
regular.SetFont(fontRegular).SetFontSize(9);
//convert html IList<IElement> lst = HtmlConverter.ConvertToElements(val);
Paragraph p = (Paragraph)lst[0]; p.AddStyle(regular);
在将 HTML 转换为 PDF 时,这是违反直觉的。
相反,我会使用 CSS 来定义 span 元素的字体、大小和样式。使用 iText 7,您现在甚至可以定义不同的 MediaQueries。例如:如果您希望 HTML 在 HTML 浏览器中显示时使用一组特定的样式,但在将 HTML 转换为 PDF 时希望使用另一组样式,则可以使用 print.css 文件。
所有这些都在HTML to PDF tutorial 中进行了解释。
在chapter 2 中,您将学习如何使用 CSS 定义样式。看看这个例子:
您会看到文本“阅读有关这部电影的更多信息”具有较小的字体大小。并且“IMDB”有不同的字体颜色。
那是因为 HTML 是这样定义的:
<div class="imdb">Read more about this movie on
<a href="www.imdb.com/title/tt4680182">IMDB</a></div>
CSS 是这样定义的:
.imdb {
font-size: 0.8em;
}
a {
color: green;
}
如您所见,<div> 有一个class 属性imdb,它在 CSS 中定义为具有较小的字体大小。 <a>-tag 的 CSS 定义文本颜色应为绿色。
所有这些都是标准的 HTML 和 CSS 功能。这里没有特定于 iText 的内容。在这种情况下,浏览器中显示的内容也会显示在 PDF 中。
iText 代码就这么简单:
HtmlConverter.convertToPdf(new File(src), new File(dest));
如果可以这么简单,你为什么要把事情复杂化?
Chapter 3 解释了如果您想在屏幕上呈现的内容和 PDF 上呈现的内容之间产生差异,该怎么做。我们使用print.css 来实现这一点(PDF 将模仿打印 HTML 文件时发生的情况)。
在您的 HTML 中,您可能有这样的内容:
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="css/sxsw.css"/>
<link rel="stylesheet" media="print only" href="css/sxsw_print.css">
</head>
sxsw.css 是在浏览器中显示 HTML 时使用的 CSS;从浏览器打印 HTML 时将使用 print.css。同样,此 HTML 中没有特定于 iText 的内容。这是任何 HTML 开发人员都知道的常见功能。
对于 iText,如果您只使用前面提到的单行,则将使用 sxsw.css。如果要改用print.css,则必须更改ConvertorProperties:
ConverterProperties properties = new ConverterProperties();
properties.setBaseUri(baseUri);
MediaDeviceDescription mediaDeviceDescription =
new MediaDeviceDescription(MediaType.PRINT);
properties.setMediaDeviceDescription(mediaDeviceDescription);
HtmlConverter.convertToPdf(
new FileInputStream(src), new FileOutputStream(dest), properties);
现在,因为我们已将 MediaDeviceDescription 更改为 MediaType.PRINT,所以将使用 print.css 样式。
如果您需要 iText 元素以便可以将它们添加到特定的矩形中,则代码仅略有不同。 chapter 1 中对此进行了解释:
List<IElement> elements =
HtmlConverter.convertToElements(new FileInputStream(src), properties);
你可能会问自己:为什么我不能按照自己的方式做呢?为什么我不应该在我的代码中定义字体大小、样式等?
答案很简单:您的代码将难以维护!如果您的雇主要求您进行更改,您将不得不更改您的代码、编译它等等......
如果您按照官方教程中描述的方式进行操作,则很简单:您不必更改代码;您只需要更改 CSS。这更容易!