使用iTextSharp在html到pdf生成中的字体面没有变化
本文关键字:字体 体面 有变化 iTextSharp html pdf 使用 | 更新日期: 2023-09-27 18:17:16
我正在使用HTML富文本编辑器来帮助我创建动态PDF报告的模板,除了它不改变字体外,它工作得很好。
这个编辑器使用的是字体标签而不是CSS样式,我欢迎以任何方式通过编程将字体标签改为使用样式的等效标签。
HTML(是的,它很乱,它来自WYSIWYG编辑器):
<div>
<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>
<u> [!PlanName] </u></b>
</font>
<font face="Times New Roman">
<br>~
<font face="Times New Roman" color="#0000FF">
<b> </b>
</font>
<font face="Times New Roman" color="#0000FF">
<b>
<font color="#000000">Deductible
$[!PlanDeductible]: </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版本
最简单的强力方法是在调用HTMLWorker.ParseToList()
之前调用FontFactory.RegisterDirectories() 。但是要注意,该方法试图在运行的系统上注册/映射所有字体。
如果你在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
替换为您选择的Stream
。结果PDF文件从上面。
HTMLWorker已经过时了。您需要切换到新的XMLWorker类。但是如果你想使用HTMLWorker,你也可以为它定义一个全局样式:
StyleSheet styles = new StyleSheet();
styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.FONTFAMILY, "tahoma");
//...
//and then
var parsedHtmlElements = HTMLWorker.ParseToList(data, styles);
http://hivelocity.dl.sourceforge.net/project/itextsharp/itextsharp/iTextSharp-5.4.1/itextsharp-all-5.4.1.zip
在那里你可以得到最新版本的iTextSharp(5.4.1)库
http://hivelocity.dl.sourceforge.net/project/itextsharp/xmlworker/xmlworker-5.4.1/itextsharp.xmlworker-all-5.4.1.zip,这里是XML工作器…它只适用于相同版本的iTextSharp (5.4.1)