使用itext 5嵌入字体以实现PDF / UA合规性

时间:2016-06-01 19:49:12

标签: itextsharp

我们目前正在构建一个概念验证,使用xslt从CSS和html(xhtml)文件生成符合PDF / UA标准的PDF。我们可以标记PDF并添加适当的元数据信息。

我们无法解决的最后一个主要问题是嵌入标准PDF字体zapfdinbats,这是我们的辅助功能评估工具所抱怨的 - 使用PAC 2.0以及内置在检查器中的adobe DC。

从下图中可以看出,我们使用的其他字体似乎是使用CSS中的xmlworker自动嵌入的。

enter image description here

我也尝试找到指示的字体并找到一个,但是,它似乎不正确。

以下是我们代码的示例

private static ReturnValue CreateFromHtml(string html)
    {
        ReturnValue Result = new ReturnValue();
        var stream = new MemoryStream();


        using (var doc = new Document(PageSize.LETTER))
        {
            using (var ms = new MemoryStream())
            {
                using (var writer = PdfWriter.GetInstance(doc, ms))
                {
                    writer.CloseStream = false;
                    writer.SetPdfVersion(PdfWriter.PDF_VERSION_1_7);

                    //TAGGED PDFVERSION_1_7
                    //Make document tagged
                    writer.SetTagged();
                    //===============
                    //PDF/UA
                    //Set document metadata
                    writer.ViewerPreferences = PdfWriter.DisplayDocTitle;

                    doc.AddLanguage("en-US");
                    doc.AddTitle("document title");
                    writer.CreateXmpMetadata();

                    doc.Open();

                    var embedfont = HttpContext.Current.Server.MapPath("~/scripts/ZapfDingbats.ttf");
                    var fontProv = new XMLWorkerFontProvider();
                    fontProv.DefaultEncoding = "UTF-8";
                    fontProv.Register(embedfont);

                    //Testing zapfDingbats font 
                    Font font = FontFactory.GetFont(embedfont, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                    Paragraph p1 = new Paragraph("Testing of Fonts", font);
                    doc.Add(p1);
                    //end font processing

                    var tagProcessors = (DefaultTagProcessorFactory)Tags.GetHtmlTagProcessorFactory();
                    tagProcessors.RemoveProcessor(HTML.Tag.IMG);
                    tagProcessors.AddProcessor(HTML.Tag.IMG, new CustomImageTagProcessor());

                    var cssFiles = new CssFilesImpl();
                    cssFiles.Add(XMLWorkerHelper.GetInstance().GetDefaultCSS());
                    var cssResolver = new StyleAttrCSSResolver(cssFiles);

                    var charset = Encoding.UTF8;
                    var context = new HtmlPipelineContext(new CssAppliersImpl(new XMLWorkerFontProvider()));
                    context.SetAcceptUnknown(true).AutoBookmark(true).SetTagFactory(tagProcessors);
                    var htmlPipeline = new HtmlPipeline(context, new PdfWriterPipeline(doc, writer));

                    var cssPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);

                    var worker = new XMLWorker(cssPipeline, true);
                    var xmlParser = new XMLParser(true, worker, charset);

                    using (var sr = new StringReader(html))
                    {
                        xmlParser.Parse(sr);
                        doc.Close();
                        ms.Position = 0;
                        ms.CopyTo(stream);
                        stream.Position = 0;
                    }
                }
            }
        }

        // get bytes from stream  
        Result.Data = stream.ToArray();

        // success  
        Result.Success = true;

        return Result;
    }

也许CSS中有一些我们需要做的事情(我们的CSS非常大f

1 个答案:

答案 0 :(得分:0)

iText仅附带Zapfdingbats的Adobe字体指标(AFM)文件。这意味着除非您提供相应的PostScript字体二进制(PFB)文件,否则无法嵌入该字体。此PFB文件无法与iText一起提供,因为iText没有许可证。

解决这个问题的第一步是:

  • 购买Zapfdingbats许可证以便获得PFB(如果我没记错,它是Adobe拥有的字体)或
  • 当您想在文本中插入特殊字符(复选框,电话符号......)时使用替代字体(例如,购买用作替换字体的AdobePiStd字体的许可证并使用该字体而不是ZAPFDINGBATS)。

在您的情况下,您提供了使用ZapfDingbats.ttf注册的字体XMLWorkerFontProvider。注册此字体时,可以通过别名识别它。如果XML Worker未选择ZapfDingbats.ttf,则PDF中使用的字体名称与ZapfDingbats.ttf注册时使用的别名之间可能不匹配。

CSS中ZapfDingbats使用的字体名称是什么?您应该使用该名称注册ZapfDingbats作为别名。