【问题标题】:itext7 set font and size of HtmlConverter elementsitext7 设置 HtmlConverter 元素的字体和大小
【发布时间】:2017-12-22 16:21:02
【问题描述】:

我正在尝试转换一些像 span 元素这样的 html 并设置它的字体和大小

我需要将此段落放在以 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】:

    可能为时已晚,但无论如何,让我告诉你我是如何解决这个问题的。 基本上你缺少以下以应用字体

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

    然后使用这个:

    HtmlConverter.ConvertToElements(stringToConvert, properties);
    

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

    【讨论】:

      【解决方案2】:

      我会避免这样的结构:

      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;
      }
      

      如您所见,&lt;div&gt; 有一个class 属性imdb,它在 CSS 中定义为具有较小的字体大小。 &lt;a&gt;-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。这更容易!

      【讨论】:

      • 我这样做是因为使用 html 和在这个 html 中定义的样式不起作用......字体没有被考虑在内,行高也不正确。此外,您没有回答如何设置使用的字体的问题。我不知道你为什么要解释打印与屏幕的事情。我的问题中从未提到过。
      • 向我们展示您的 HTML。如果没有您的 HTML,我们将无法重现该问题。从教程中的示例可以看出,行高、字体系列、字体样式和字体大小都被考虑在内。请注意,如果您想使用未开箱即用的字体,您可能需要定义 FontProvider。如果问题的 focus 不正确,我很抱歉。也许那是因为问题不清楚。在没有额外信息的情况下说“它不起作用”的问题总是很难回答。
      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 2018-02-03
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-17
      相关资源
      最近更新 更多