как проверить, если шрифт встраиваемый - PullRequest
4 голосов
/ 15 апреля 2011

Я использую 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?

1 Ответ

5 голосов
/ 15 апреля 2011

Насколько я могу судить, прямого способа определить, можно ли внедрить шрифт, нет. Я сделал быстрый поиск, и я не думаю, что это возможно, кроме как с помощью метода перехвата исключений, упомянутого Эриком в комментариях.

 // 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

Поиск WindowsMetrics в Google, и это было то, что я получил.

Это объясняет, что параметр fsType содержит информацию о том, можно ли внедрить шрифт. http://www.microsoft.com/typography/otspec/os2ver3.htm#fst

Java-эквивалент WindowsMetrics, используемый в itext http://www.docjar.org/docs/api/com/lowagie/text/pdf/TrueTypeFont.WindowsMetrics.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...