【问题标题】:Unable to Set Font Family in iTextSharp XMLWorker无法在 iTextSharp XMLWorker 中设置字体系列
【发布时间】:2013-10-23 22:21:59
【问题描述】:

我正在尝试使用 itextsharp XMLWorker 库将一些 HTML 解析为 PDF。它工作正常,但我无法将一些 Unicode 字符(土耳其语)渲染到我的 pdf 中。

我已经阅读了几个关于这个问题的博客,他们都建议注册一种支持 unicode 字符的字体。然后在外部 css 文件中,我需要指定要使用的字体系列。

html
{
    font-family: 'Arial Unicode MS';
}

我也尝试了所有Arial 作为家人。我也尝试在 html 中设置家庭。

<body face = 'Arial'>

它们都没有工作。字体注册没有问题,外部 CSS 文件也可以工作。

这就是我将 HTML 转换为 PDF 的方法,

string arialuniTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF");
FontFactory.Register(arialuniTff);

// Resolve CSS
var cssResolver = new StyleAttrCSSResolver();
var cssFile = XMLWorkerHelper.GetCSS(new FileStream(Server.MapPath("~/Content/Editor.css"), FileMode.Open));
cssResolver.AddCss(cssFile);

// HTML
CssAppliers ca = new CssAppliersImpl();
HtmlPipelineContext hpc = new HtmlPipelineContext(ca);
hpc.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

// PIPELINES
PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
HtmlPipeline htmlPipe = new HtmlPipeline(hpc, pdf);
CssResolverPipeline css = new CssResolverPipeline(cssResolver, htmlPipe);

XMLWorker worker = new XMLWorker(css, true);
XMLParser p = new XMLParser(worker);
StringReader sr = new StringReader("<html><head></head><body>" + topMessage.Replace("<br>", "<br></br>") + "</body></html>");
p.Parse(sr);

【问题讨论】:

    标签: c# itextsharp


    【解决方案1】:

    我看到您创建 CssAppliersImpl 实例时没有使用参数。如果你想处理字体,你应该创建一个“FontProvider”实现并使用该实现的一个实例作为CssAppliersImpl构造函数的参数。例如:创建一个TestFontProvider 类,显示解析 HTML 时需要哪些字体名称。这将帮助您了解是否注册了正确的字体。如果您看到所有必需的字体都已注册,则问题可能是由其他原因引起的。例如:可能使用错误的编码解析 HTML...

    【讨论】:

      【解决方案2】:

      经过多次尝试,这是可行的解决方案:

       string fontPath = Path.Combine(@"fonts\Gaegu-Regular.ttf");
       var fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
       fontProvider.Register(fontPath);            
       CssAppliers ca = new CssAppliersImpl(fontProvider);
       HtmlPipelineContext htmlContext = new HtmlPipelineContext(ca);
       var pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer)));
      

      谢谢。

      【讨论】:

        猜你喜欢
        • 2016-03-17
        • 2016-12-16
        • 2017-08-12
        • 2012-12-21
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        • 1970-01-01
        相关资源
        最近更新 更多