创建PDF / A文件时,我收到错误:“Helvetica未嵌入”

时间:2018-04-16 12:58:08

标签: c# itext

我正在使用iText for .NET,我收到一条PdfAConformanceException消息:

  

“必须嵌入所有字体。这不是:Helvetica”

我如何嵌入Helvetica?

这是我的代码

static void Main(string[] args)
{
   ConverterProperties properties = new ConverterProperties();
   properties.SetBaseUri(null);
   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 StreamReader(INTENT).BaseStream));                   

   pdf.SetTagged();

   var html = @"<!DOCTYPE html>
                <html>
                   <body>
                      <h1>My First Heading</h1>
                      <p>My first paragraph.</p>
                   </body>
                </html>
              ";

  HtmlConverter.ConvertToPdf(html, pdf, properties);
}

1 个答案:

答案 0 :(得分:1)

请阅读iText 7 Jump-start tutorial,更具体地说,Chapter 7: Creating PDF/UA and PDF/A documents

我引用:

  

创建用于长期保存的PDF,第1部分

     

ISO 19005的第1部分于2005年发布。它被定义为子集   Adobe PDF版规范的1.4版本(当时,   还不是ISO标准)。 ISO 19005-1推出了一系列   义务和限制:

     
      
  • 文档需要自包含:所有字体都需要   嵌入式;不允许使用外部电影,声音或其他二进制文件。
  •   
  • 该文档需要包含可扩展元数据中的元数据   平台(XMP)格式: ISO 16684(XMP)描述了如何嵌入XML   元数据转换成二进制文件,使软件不知道如何   解释二进制数据格式仍然可以提取文件的   元数据。
  •   
  • 不允许使用非面向未来的功能: PDF不能   包含任何JavaScript,可能不加密。
  •   

您遇到的问题是未嵌入字体。这是因为您没有提供字体程序。 iText附带14 标准Type 1字体的字体指标(该版本中有14个AFM文件)。这些是每个PDF查看器都应该知道的字体。如果您真的想使用Helvetica,则需要提供字体二进制文件(PFB文件)。 这些文件不能与iText一起提供,因为这些文件是专有的。如果您想使用这些文件的所有者,您需要购买该许可证。

我认为你的问题是错的:“我怎样才能嵌入Helvetica?”那就是:您不想购买所需的PFB文件。作为替代方案,您可以使用教程中的免费字体:

public const String FONT = "resources/font/FreeSans.ttf";
PdfFont font = PdfFontFactory.CreateFont(FONT, PdfEncodings.WINANSI, true);
Paragraph p = new Paragraph()
    .SetFont(font).Add(new Text("Text with embedded font."));

这是迈向PDF / A一致性的第一步。它将解决您在问题中描述的问题。但是,由于您没有在您的问题中共享任何代码(这违反了Stack Overflow的规则),我假设您缺少大量其他PDF / A要求。您将在official web site上的教程中发现有关这些要求的更多信息。