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

问题描述 投票:0回答:1

我正在尝试将一些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元素的样式中设置字体和大小吗?

itext7
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

您会看到文本“阅读有关此电影的更多信息”的字体大小较小。并且“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。那更容易!

© www.soinside.com 2019 - 2024. All rights reserved.