【发布时间】:2018-09-12 12:57:41
【问题描述】:
我使用了 iTextSharp,所有土耳其语字符都消失了。 html inline css 属性也适用于 table 元素,但不适用于 div 元素。
我尝试了很多编码转换示例代码,但没有找到任何结果。
我的示例代码:
public static byte[] HtmlToPdfItextSharp(string HTMLCONTENTSTRING, List<string> cssFiles = null)
{
using (var ms = new MemoryStream())
{
Document pdfDoc = new Document(PageSize.A4.Rotate(), 10, 10, 10, 10);
BaseFont STF_Helvetica_Turkish = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, "CP1254", BaseFont.NOT_EMBEDDED);
Font fontNormal = new Font(STF_Helvetica_Turkish, 12, Font.NORMAL, BaseColor.BLACK);
string fontPath = Path.Combine(Path.Combine(Server.MapPath("~/App_Data/Pdf/arial.ttf")));
XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
fontProvider.UseUnicode = true;
fontProvider.Register(fontPath);
CssAppliers ca = new CssAppliersImpl(fontProvider);
var pdfWriter = PdfWriter.GetInstance(pdfDoc, ms);
pdfDoc.Open();
pdfWriter.DirectContent.SetFontAndSize(STF_Helvetica_Turkish, 12);
pdfWriter.CloseStream = false;
var htmlContext = new HtmlPipelineContext(null);
htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
cssFiles.ForEach(e => cssResolver.AddCssFile(e, true));
var pp = new PdfWriterPipeline(pdfDoc, pdfWriter);
IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, pp));
XMLWorker worker = new XMLWorker(pipeline, true);
XMLParser parser = new XMLParser(worker);
parser.Parse(new MemoryStream(Encoding.UTF8.GetBytes(HTMLCONTENTSTRING)));
pdfDoc.Close();
return ms.GetBuffer();
}
}
【问题讨论】:
-
您正在混合各种不应该混合的东西:
pdfWriter.DirectContent.SetFontAndSize(STF_Helvetica_Turkish, 12);在 HTML 到 PDF 的上下文中没有意义。(BaseFont.TIMES_ROMAN, "CP1254")没有意义,因为 Times Roman 没有所有的土耳其字形等等。您正在使用仅支持付费客户的旧 iText 版本的 维护 版本。升级到 iText 7 + pdfHTML developers.itextpdf.com/content/… -
简而言之:在 iText 7 中 XMLWorker 已被 pdfHTML 取代。有关更多信息,请参阅introduction of the HTML to PDF tutorial。
标签: itext