我正在尝试将某些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元素的样式设置字体和大小?
答案 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定义样式。看一下这个例子:
你看到文字&#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。这更容易!