C# 使用iTextSharp生成html到pdf时,字体没有变化

C# 使用iTextSharp生成html到pdf时,字体没有变化,c#,itextsharp,font-face,html-to-pdf,C#,Itextsharp,Font Face,Html To Pdf,我正在使用一个HTML富文本编辑器来帮助我为动态PDF报告创建一个模板,它工作得很好,只是没有改变字体 这个编辑器使用的是字体标记而不是CSS样式,我欢迎任何通过编程将字体标记改为使用样式的等效标记的方法 HTML(是的,很凌乱,来自WYSIWYG编辑器): 例子 室 网站 引用 ~ [!PlanName] ~ 可扣除的 $[!计划免赔额]: [!平面图] /~/~ 版权所有Example.com 测试 C#: publicstaticbyte[]Co

我正在使用一个HTML富文本编辑器来帮助我为动态PDF报告创建一个模板,它工作得很好,只是没有改变字体

这个编辑器使用的是字体标记而不是CSS样式,我欢迎任何通过编程将字体标记改为使用样式的等效标记的方法

HTML(是的,很凌乱,来自WYSIWYG编辑器):




例子 室 网站 引用

~ [!PlanName]
~ 可扣除的 $[!计划免赔额]: [!平面图]
/~/~


版权所有Example.com

测试












C#:

publicstaticbyte[]ConvertHtmlToPdf(字符串html)
{
html=HtmlPostProcessor.Process(html);
字节[]fileData=null;
字符串tempPath=ConfigurationManager.AppSettings[“TempDirectory”];
字符串temppdfile=Path.Combine(tempPath,Guid.NewGuid()+“.pdf”);
文档=新文档(PageSize.LETTER,50,50,50,50);
使用(FileStream fs=newfilestream(temppdfile,FileMode.Create))
{
GetInstance(文档,fs);
使用(StringReader StringReader=new StringReader(html))
{
List parsedList=HTMLWorker.ParseToList(stringReader,null);
document.Open();
foreach(parsedList中的IEElement项)
{
文件。添加(项目);
}
document.Close();
}
}
FileStream generatedPDF=File.Open(temppdfile,FileMode.Open);
fileData=新字节[(int)generatedPDF.Length];
int result=generatedPDF.Read(fileData,0,(int)generatedPDF.Length);
generatedPDF.Close();
文件。删除(temppdfile);
返回文件数据;
}
编辑


我一直在使用iTextSharp版本5.1.1.0。

最简单的暴力方式是在调用
HTMLWorker.parsetList()之前调用。但是,请注意-该方法试图在运行的系统上注册/映射所有字体

例如,如果您在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);
  }
}
FontFactory.RegisterDirectories();
使用(文档=新文档()){
GetInstance(文档、响应、输出流);
document.Open();
List objects=HTMLWorker.parsetList(
新的StringReader(html),null);
foreach(对象中的IEElement元素){
文件。添加(元素);
}
}

只需用您选择的
替换
Response.OutputStream

HTMLWorker已过时。您需要切换到新类。 但如果您想使用HTMLWorker,也可以为其定义全局样式:

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

在那里,您可以获得iTextSharp(5.4.1)库的最新版本


这里是XML工作者。。。它只适用于相同版本的iTextSharp(5.4.1)

有没有办法只注册一些字体?比如说8种web字体?另外,在HTMLWorker.ParseToList()之前插入FontFactory.RegisterDirectories()行除了让它变慢之外,什么都没做,但我明天会查看您链接到的文档。谢谢你用的是什么版本?我在您的示例中使用HTML对5.1.3进行了测试,效果良好。这个在打开
文档
对象之前,您可能需要插入对`FontFactory.RegisterDirectories()`的调用,抱歉。我会试试看,今天晚些时候/明天晚些时候我是否能拿出一个例子来注册有限数量的字体。我看了那个PDF,你可以从例子中E上缺少衬线看出字体不起作用。@capn-你上面的HTML片段有以下字体:Times New Roman、Courier New和Arial。如果打开链接的PDF并查看嵌入的字体,它们都在那里。(HTML代码段中没有serif字体)要回答第一个问题,您可以通过调用重载方法之一注册一些字体,但必须将所需的字体文件放在指定目录中。我在iTextSharp库中找不到XMLWorker,我只看到它在Java iText库中被引用。是否缺少一个名称空间?
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);
  }
}
StyleSheet styles = new StyleSheet();
styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.FONTFAMILY, "tahoma");
//...
//and then
var parsedHtmlElements = HTMLWorker.ParseToList(data, styles);