html 标签在 html 使用 itextSharp 转换为 pdf 时未转换
html tags not converting when html to pdf convert using itextSharp
我正在尝试使用 iTextSharp 创建一个 pdf,它做到了。但它也在 pdf 中打印 html 标签,而不是将其作为围绕文本的设计
Document pdfDoc = new Document(PageSize.A4, 25, 10, 25, 10);
PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
pdfDoc.Open();
Paragraph Text = new Paragraph("<b>Hiii</b>");
pdfDoc.Add(Text);
pdfWriter.CloseStream = false;
pdfDoc.Close();
Response.Buffer = true;
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=Example.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Write(pdfDoc);
Response.End();
}
它的输出是 Hiii,它在代码中看起来是粗体标记,但我想要 Hiii
您希望 iText 解析其布局元素 (Paragraph
, ...) 文本中的 HTML 标签,但 iText 不会这样做。要在 iText 中获取“Hiii”而不是“Hiii”,您基本上有两个选择:
对粗体文本明确使用粗体,对常规文本明确使用普通字体。
var phrase = new Phrase();
phrase.Add(new Chunk("REASON(S) FOR CANCELLATION:", boldFont));
phrase.Add(new Chunk(" See Statutoryreason(s) designated by Code No(s) 1 on the reverse side hereof", normalFont));
这在评论中对 the question @Ratheesh pointed to 的回答中有详细解释。特别是,您可以通过明确命名粗体字体来获得粗体字体,例如
var normalFont = FontFactory.GetFont(FontFactory.HELVETICA, 12);
var boldFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 12);
或者你可以让iText找一个字体家族的粗体;如果 iText 找不到它,它将通过沿着字体字形的轮廓画一条线来创建普通字体的粗体版本:
Font verdanaBold = FontFactory.GetFont("Verdana", 7f, Font.BOLD);
使用 XMLWorker
解析 XHTML 并从中生成相应样式的布局元素。
这在堆栈溢出的许多答案中也有解释,例如参见 [=19=] 中的 CreateSimpleHtmlParagraph
方法:
private static Phrase CreateSimpleHtmlParagraph(String text)
{
var p = new Phrase();
var mh = new MyElementHandler();
using (TextReader sr = new StringReader("<html><body><p>" + text + "</p></body></html>"))
{
XMLWorkerHelper.GetInstance().ParseXHtml(mh, sr);
}
foreach (var element in mh.elements)
{
foreach (var chunk in element.Chunks)
{
p.Add(chunk);
}
}
return p;
}
(助手 class MyElementHandler
显示在参考答案中。)
我正在尝试使用 iTextSharp 创建一个 pdf,它做到了。但它也在 pdf 中打印 html 标签,而不是将其作为围绕文本的设计
Document pdfDoc = new Document(PageSize.A4, 25, 10, 25, 10);
PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
pdfDoc.Open();
Paragraph Text = new Paragraph("<b>Hiii</b>");
pdfDoc.Add(Text);
pdfWriter.CloseStream = false;
pdfDoc.Close();
Response.Buffer = true;
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=Example.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Write(pdfDoc);
Response.End();
}
它的输出是 Hiii,它在代码中看起来是粗体标记,但我想要 Hiii
您希望 iText 解析其布局元素 (Paragraph
, ...) 文本中的 HTML 标签,但 iText 不会这样做。要在 iText 中获取“Hiii”而不是“Hiii”,您基本上有两个选择:
对粗体文本明确使用粗体,对常规文本明确使用普通字体。
var phrase = new Phrase(); phrase.Add(new Chunk("REASON(S) FOR CANCELLATION:", boldFont)); phrase.Add(new Chunk(" See Statutoryreason(s) designated by Code No(s) 1 on the reverse side hereof", normalFont));
这在评论中对 the question @Ratheesh pointed to 的回答中有详细解释。特别是,您可以通过明确命名粗体字体来获得粗体字体,例如
var normalFont = FontFactory.GetFont(FontFactory.HELVETICA, 12); var boldFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 12);
或者你可以让iText找一个字体家族的粗体;如果 iText 找不到它,它将通过沿着字体字形的轮廓画一条线来创建普通字体的粗体版本:
Font verdanaBold = FontFactory.GetFont("Verdana", 7f, Font.BOLD);
使用
XMLWorker
解析 XHTML 并从中生成相应样式的布局元素。这在堆栈溢出的许多答案中也有解释,例如参见 [=19=] 中的
CreateSimpleHtmlParagraph
方法:private static Phrase CreateSimpleHtmlParagraph(String text) { var p = new Phrase(); var mh = new MyElementHandler(); using (TextReader sr = new StringReader("<html><body><p>" + text + "</p></body></html>")) { XMLWorkerHelper.GetInstance().ParseXHtml(mh, sr); } foreach (var element in mh.elements) { foreach (var chunk in element.Chunks) { p.Add(chunk); } } return p; }
(助手 class
MyElementHandler
显示在参考答案中。)