我使用itext创建PDf文档。由于许可限制,某些字体无法使用。
...
ExceptionConverter: com.lowagie.text.DocumentException: C:\WINDOWS\Fonts\LucidaSansRegular.ttf cannot be embedded due to licensing restrictions.
at com.lowagie.text.pdf.TrueTypeFontUnicode.<init>(Unknown Source)
at com.lowagie.text.pdf.BaseFont.createFont(Unknown Source)
at com.lowagie.text.pdf.BaseFont.createFont(Unknown Source)
at com.lowagie.text.pdf.BaseFont.createFont(Unknown Source)
at com.lowagie.text.pdf.DefaultFontMapper.awtToPdf(Unknown Source)
at com.lowagie.text.pdf.PdfGraphics2D.getCachedBaseFont(Unknown Source)
at com.lowagie.text.pdf.PdfGraphics2D.setFont(Unknown Source)
...
我正在考虑检查字体或PDF内容以检查这种情况。如何使用java或itext检查Font是否可嵌入?
答案 0 :(得分:5)
据我所知,没有直接的方法来确定是否可以嵌入字体。 我做了一个快速搜索,除了在评论中使用Erik提到的异常catch方法之外,我认为不可能。
// 1) have a list of all fonts ArrayList allAvailableFonts;
// 2) second list of fonts that that can be embedded ArrayList embedableFonts;
//Iterate through every available font in allAvailableFonts
for( .... allAvailableFonts ..... )
{
boolean isFontEmbeddable = true;
try
{
// try to embed the font
}
catch( DocumentException de)
{
//this font cannot be embedded
isEmbeddable = false;
}
if( isEmbeddable )
{
// add to list of embeddable fonts
embedableFonts.add ( font );
}
}
你可能真的去硬核并执行对Windows Apis的本机调用以获得相同的结果,但我认为这对于一个简单的任务来说太多了。
进行了一些研究并发现Java如何抛出此异常
可以在此处找到生成上述异常的代码。 http://kickjava.com/src/com/lowagie/text/pdf/TrueTypeFont.java.htm 第367,368号线
if (!justNames && embedded && os_2.fsType == 2)
throw new DocumentException(fileName + style + " cannot be embedded due to licensing restrictions.");
需要注意的有趣部分是条件os_2.fsType == 2
os_2是WindowsMetrics
的一个实例,请参见第174行
http://kickjava.com/src/com/lowagie/text/pdf/TrueTypeFont.java.htm
在Google中搜索WindowsMetrics,这就是我得到的。
这解释了参数fsType保存是否可以嵌入字体的信息。 http://www.microsoft.com/typography/otspec/os2ver3.htm#fst
在itext中使用的java等效的WindowsMetrics http://www.docjar.org/docs/api/com/lowagie/text/pdf/TrueTypeFont.WindowsMetrics.html