代码之家  ›  专栏  ›  技术社区  ›  Mario Rossi

将HTML转换为PDF/A时,我得到“所有字体都必须嵌入。这一个不是:Times Bold”

  •  0
  • Mario Rossi  · 技术社区  · 6 年前
    public const String INTENT = "sRGB Color Space Profile.icm";
    static void Main(string[] args)
    {
        String HTML = "<h1>Test</h1><p>Hello World</p>";            
        PdfWriter writer = new PdfWriter("hello.pdf");
        PdfADocument pdf = new PdfADocument(writer, PdfAConformanceLevel.PDF_A_3A, new PdfOutputIntent("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", new FileStream(INTENT, FileMode.Open)));
        pdf.SetTagged();
        ConverterProperties properties = new ConverterProperties();
        properties.SetBaseUri("");
        HtmlConverter.ConvertToPdf(HTML, pdf, properties);
    }
    

    当我运行这段代码时,我得到一个PdfAConformanceException“所有字体都必须嵌入。这一个不是:Times Bold”。

    我尝试通过以下几行获得注册字体:

    var fonts = "";
    foreach (string fontname in iTextSharp.text.FontFactory.RegisteredFonts)
    {
        fonts += fontname + " ";
    }
    

    我得到:“courier courier bold courier Collateral courier BoldCollateral helvetica helvetica bold helvetica Collateral helvetica BoldCollateral symbol times roman 倍加粗 times italic times bolditalic zapfdingbats”,所以times bold在那里。

    我错过什么了吗?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Michaël Demey    6 年前

    这里的问题是PDF中有14种默认字体,默认情况下pdfHtml/iText不会嵌入默认字体。您可以通过如下方式实例化和配置FontProvider,告诉pdfHtml“跳过”注册默认字体:

    DefaultFontProvider fontProvider = new DefaultFontProvider(false, true, true);
    properties.setFontProvider(fontProvider);
    

    这将生成一个包含“Freesans”嵌入子集的PDF文件。

    有关更多信息,请参阅以下内容:

        2
  •  1
  •   Bruno Lowagie    6 年前

    当您向iText询问注册的字体时,它会提供字体工厂已知的所有字体。这意味着您可以在创建普通PDF文件(ISO 32000)时使用所有这些字体。

    然而,并非所有注册字体都是可以嵌入PDF的字体,嵌入字体是PDF/a的要求之一(ISO 19005)。请允许我引用 chapter 1 of the building blocks tutorial :

    iText支持标准的Type 1字体,因为io jar包含 这14种字体的Adobe字体度量(AFM)文件。这些文件 包含计算宽度和 单词和线条的高度。这是创建 文本

    如果我们想嵌入字体,我们需要一个字体程序。在以下情况下: 标准类型1字体,此字体程序存储在PostScript字体中 二进制(PFB)文件。对于14种标准的Type 1字体 文件是专有的;不能随iText一起发货,因为iText 组没有这样做的许可证。我们只允许运送 度量文件。

    因此,iText无法嵌入这14种字体,但它不能 意味着iText无法嵌入字体。

    您列出为注册字体的所有字体都是标准的Type 1字体。如果没有相应的PFB文件,则不能在PDF/a文件中使用这些字体。您应该提供字体程序(例如。 .ttf .otf 文件),并确保在将HTML转换为PDF时使用这些文件。

    如何做到这一点?这也在 official web site 看见 chapter 4 of the HTML to PDF tutorial .在该示例中,我们定义了如下字体:

    <body style="font-family: FreeSans">
    

    如中所述 chapter 7 of the same tutorial ,字体FreeSans随pdfHTML附加组件一起提供。

    将HTML代码段更改为:

    <body style="font-family: FreeSans"><h1>Test</h1><p>Hello World</p></body>
    

    这样,您将避免使用未嵌入的标准Type 1字体,并将符合PDF/a的要求。