【问题标题】:No change in font face in html to pdf generation using iTextSharp使用 iTextSharp 生成 html 到 pdf 的字体没有变化
【发布时间】:2012-01-17 03:31:06
【问题描述】:

我正在使用 HTML 富文本编辑器来帮助我为动态 PDF 报告创建模板,它工作正常,只是它不会改变字体。

这个编辑器使用字体标签而不是 CSS 样式,我欢迎任何方式以编程方式将字体标签更改为使用样式的等效标签。

HTML(是的,它很乱,它来自所见即所得的编辑器):

<div>&nbsp;
<br>
  <div align="center">
    <font size="5">
      <b>
        <br>
          <div align="center">
            <font font-face="Times New Roman" size="5">
              <b>Example 
              <font size="6">Chamber 
              <font size="5">
                <font size="4">Website</font>
              </font></font>Quotes</b>
            </font>
            <font face="Times New Roman">
              <br>
                <font face="Times New Roman">
                  <br>~
                  <font face="Times New Roman" color="#0000FF">
                    <b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    <u>&nbsp;[!PlanName]&nbsp;</u></b>
                  </font>
                  <font face="Times New Roman">
                    <br>~
                    <font face="Times New Roman" color="#0000FF">
                      <b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b>
                    </font>
                    <font face="Times New Roman" color="#0000FF">
                      <b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

                      <font color="#000000">Deductible&nbsp;
                      $[!PlanDeductible]:&nbsp;&nbsp;</font></b>
                    </font>
                    <font face="Times New Roman" color="#B0B0FF">
                    [!PlanRate]
                    <br>
                      <font face="Times New Roman">/~/~</font>
                      <br>
                        <br>
                          <br>
                            <font face="Courier New" size="1">
                            Copyright Example.com</font>
                            <br>
                              <br>
                                <font face="Arial">test</font>
                                <br></br>
                              </br>
                            </br>
                          </br>
                        </br>
                      </br>
                    </br></font></br>
                  </font></br>
                </font>
              </br>
            </font>
          </div>
        </br>
      </b>
    </font>
  </div>
</br></div>

C#:

public static byte[] ConvertHtmlToPdf(string html)
{
    html = HtmlPostProcessor.Process(html);
    byte[] fileData = null;
    string tempPath = ConfigurationManager.AppSettings["TempDirectory"];
    string tempPDFFile = Path.Combine(tempPath, Guid.NewGuid() + ".pdf");
    Document document = new Document(PageSize.LETTER, 50, 50, 50, 50);

    using (FileStream fs = new FileStream(tempPDFFile, FileMode.Create))
    {
        PdfWriter.GetInstance(document, fs);
        using (StringReader stringReader = new StringReader(html))
        {
            List<IElement> parsedList = HTMLWorker.ParseToList(stringReader, null );
            document.Open();
            foreach (IElement item in parsedList)
            {
                document.Add(item);
            }
            document.Close();
        }
    }

    FileStream generatedPDF = File.Open(tempPDFFile, FileMode.Open);
    fileData = new byte[(int)generatedPDF.Length]; 
    int result = generatedPDF.Read(fileData, 0, (int)generatedPDF.Length);

    generatedPDF.Close();

    File.Delete(tempPDFFile);

    return fileData;
}

编辑

我一直在使用 iTextSharp 5.1.1.0 版。

【问题讨论】:

    标签: c# itextsharp font-face html-to-pdf


    【解决方案1】:

    最简单的暴力方法是调用FontFactory.RegisterDirectories() 调用HTMLWorker.ParseToList()。但是请注意 - 该方法会尝试在正在运行的系统上注册/映射 所有 字体。

    因此,例如,如果您在 ASP.NET 中运行它,您可能希望将调用放在 global.asax 中。

    编辑:使用FontFactory.RegisterDirectories() 和您在上面提供的HTML 的工作示例:

    FontFactory.RegisterDirectories();
    using (Document document = new Document()) {
      PdfWriter.GetInstance(document, Response.OutputStream);
      document.Open();
      List<IElement> objects = HTMLWorker.ParseToList(
        new StringReader(html), null);
      foreach (IElement element in objects) {
        document.Add(element);
      }
    }
    

    只需将Response.OutputStream 替换为您选择的StreamResult PDF file from above.

    【讨论】:

    • 有没有办法只注册几种字体?说 8 种网络字体?
    • 另外,在 HTMLWorker.ParseToList() 之前插入行 FontFactory.RegisterDirectories() 并没有做任何事情,只是让它变慢,但我会查看你明天链接到的文档。谢谢!
    • 你用的是什么版本?我在您的示例中使用 HTML 对 5.1.3 进行了测试,并且效果很好。 result PDF file is here。您可能希望在打开Document 对象之前插入对`FontFactory.RegisterDirectories()` 的调用,抱歉。我会试着看看我是否可以在今天/明天晚些时候想出一个例子来注册有限数量的字体。
    • 我查看了该 PDF,您可以通过该 E 上缺少衬线来判断该字体不起作用。
    • @capn - 您上面的 HTML sn-p 具有以下字体:Times New Roman、Courier New 和 Arial。如果您打开链接的 PDF 并查看嵌入的字体,它们都在那里。 (HTML sn-p 中没有衬线字体)要回答您的第一个问题,您可以通过调用其中一个重载的 FontFactory.RegisterDirectory 方法来注册一些字体,但是您必须将指定目录中所需的字体文件。
    【解决方案2】:

    HTMLWorker 已过时。您需要切换到新的XMLWorker 类。 但是如果你想使用 HTMLWorker,你也可以为它定义一个全局样式:

    StyleSheet styles = new StyleSheet();
    styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.FONTFAMILY, "tahoma");
    //...
    //and then
    var parsedHtmlElements = HTMLWorker.ParseToList(data, styles);
    

    【讨论】:

    • 我在 iTextSharp 库中的任何地方都找不到 XMLWorker,我只看到它在 Java iText 库中被引用。有没有我缺少的命名空间?
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      相关资源
      最近更新 更多