我们目前正在构建一个概念验证,使用xslt从CSS和html(xhtml)文件生成符合PDF / UA标准的PDF。我们可以标记PDF并添加适当的元数据信息。
我们无法解决的最后一个主要问题是嵌入标准PDF字体zapfdinbats,这是我们的辅助功能评估工具所抱怨的 - 使用PAC 2.0以及内置在检查器中的adobe DC。
从下图中可以看出,我们使用的其他字体似乎是使用CSS中的xmlworker自动嵌入的。
我也尝试找到指示的字体并找到一个,但是,它似乎不正确。
以下是我们代码的示例
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
答案 0 :(得分:0)
iText仅附带Zapfdingbats的Adobe字体指标(AFM)文件。这意味着除非您提供相应的PostScript字体二进制(PFB)文件,否则无法嵌入该字体。此PFB文件无法与iText一起提供,因为iText没有许可证。
解决这个问题的第一步是:
在您的情况下,您提供了使用ZapfDingbats.ttf
注册的字体XMLWorkerFontProvider
。注册此字体时,可以通过别名识别它。如果XML Worker未选择ZapfDingbats.ttf
,则PDF中使用的字体名称与ZapfDingbats.ttf
注册时使用的别名之间可能不匹配。
CSS中ZapfDingbats使用的字体名称是什么?您应该使用该名称注册ZapfDingbats
作为别名。