我正在使用HTML Rich-Text Editor来帮助我为动态PDF报告创建一个模板,它工作正常,只是它不会改变font-face。
此编辑器使用的是字体标记而不是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。
答案 0 :(得分:2)
最简单,最蛮力的方法是在调用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
即可。 Result PDF file from above
答案 1 :(得分:1)
HTMLWorker已过时。您需要切换到新的XMLWorker类。 但是如果你想使用HTMLWorker,你也可以为它定义一个全局样式:
StyleSheet styles = new StyleSheet();
styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.FONTFAMILY, "tahoma");
//...
//and then
var parsedHtmlElements = HTMLWorker.ParseToList(data, styles);
答案 2 :(得分:0)
在那里你可以得到最后一个版本的iTextSharp(5.4.1)库
这里是XML工作者......它只适用于相同版本的iTextSharp(5.4.1)