itext7设置HtmlConverter元素的字体和大小

时间:2017-12-22 16:21:03

标签: itext7

我正在尝试将某些html转换为span元素并设置其字体和大小

我需要将此段放在以pdf格式定义的文本区域之上。

这就是我做的事情

//define style  
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);

//size of field, need to put html paragraph on top of it 
PdfArray position = toSet.GetWidgets()[0].GetRectangle(); 
float width = (float)(position.GetAsNumber(2).GetValue() - position.GetAsNumber(0).GetValue()); 
float height = (float)(position.GetAsNumber(3).GetValue() - position.GetAsNumber(1).GetValue()); 
Rectangle rect = new Rectangle((float)position.GetAsNumber(0).GetValue(), (float)position.GetAsNumber(1).GetValue(), width, height);            

//canvas to add paragraph 
Canvas canvasField = new Canvas(canvas, pdf, rect); 
canvasField.Add(p); 
canvas.Rectangle(rect);

但字体未应用。

是否可以以span html元素的样式设置字体和大小?

2 个答案:

答案 0 :(得分:3)

可能要晚了,但无论如何让我告诉你我是如何解决的。 基本上,您缺少使用字体的后续步骤

FontProvider provider = new FontProvider();
provider.AddFont([your font]);

ConverterProperties properties = new ConverterProperties();
properties.SetFontProvider(provider);

,然后使用它:

HtmlConverter.ConvertToElements(stringToConvert, properties);

这样,我设法将字体应用于转换后的html元素(段落)

答案 1 :(得分:1)

我会避免像这样的结构:

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定义样式。看一下这个例子:

enter image description here

你看到文字&#34;了解更多关于这部电影&#34;具有较小的字体大小。那个&#34; IMDB&#34;有不同的字体颜色。

那是因为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> - 标签的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。这更容易!