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 + " ";
}
我得到:“快递快递 - 大胆快递 - 倾斜快递 - boldoblique helvetica helvetica-bold helvetica-oblique helvetica-boldoblique symbol times-roman times-bold times-italic times-bolditalic zapfdingbats” ,那么时间大胆就在那里。
我错过了什么吗?
答案 0 :(得分:3)
这里的问题是PDF中有14种默认字体,默认情况下,默认字体不是由pdfHtml / iText嵌入的。您可以将pdfHtml告诉&#34;跳过&#34;通过实例化和配置FontProvider来注册默认字体,如下所示:
DefaultFontProvider fontProvider = new DefaultFontProvider(false, true, true);
properties.setFontProvider(fontProvider);
这将生成一个PDF文件,其中包含&#34; Freesans&#34;的嵌入子集。
有关详细信息,请参阅以下内容:
答案 1 :(得分:1)
当您向iText询问注册字体时,它会为您提供字体工厂已知的所有字体。这意味着您可以在创建普通PDF文件(ISO 32000)时使用所有这些字体。
但是,并非所有注册字体都是可嵌入PDF的字体,嵌入字体是PDF / A(ISO 19005)的要求之一。请允许我引用chapter 1 of the building blocks tutorial:
iText支持标准类型1字体,因为io-jar包含 这14种字体的Adobe Font Metrics(AFM)文件。这些文件 包含计算宽度和所需的指标 单词和行的高度。这是创建的布局所必需的 文本。
如果我们想嵌入字体,我们需要一个字体程序。在的情况下 标准Type 1字体,此字体程序存储在PostScript字体中 二进制(PFB)文件。在14种标准Type 1字体的情况下,那些 文件是专有的;它们不能与iText一起发货,因为iText 集团没有这样做的许可。我们只允许运送 度量文件。
因此,iText无法嵌入这14种字体,但事实并非如此 意味着iText无法嵌入字体。
您列为注册字体的所有字体均为标准类型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的要求。