2016-01-30 6 views
1

У меня есть файл XML, содержащий список имен, некоторые из которых используют символы/глифы, которые не представлены в по умолчанию PDF шрифта по (Helvetica/Arial):Отображение символов Unicode в PDF продуцируемые Apache FOP

<name>Paul</name> 
<name>你好</name> 

Я обрабатываю этот файл с помощью XSLT и Apache FOP для создания файла PDF, в котором перечислены имена. В настоящее время я получаю следующее предупреждение на консоли и китайские символы заменяются ## в PDF:

Jan 30, 2016 11:30:56 AM org.apache.fop.events.LoggingEventListener processEvent WARNING: Glyph "你" (0x4f60) not available in font "Helvetica". 
Jan 30, 2016 11:30:56 AM org.apache.fop.events.LoggingEventListener processEvent WARNING: Glyph "好" (0x597d) not available in font "Helvetica". 

Я посмотрел на документацию и, кажется, предполагают, что доступные варианты:

  1. Используйте шрифт OpenType, за исключением того, что FOP не поддерживается.
  2. Переключить на другой шрифт только для тех частей текста, которые не являются ASCII.

Я не хочу использовать разные шрифты для каждого языка, потому что будут PDF-файлы, которые имеют смесь китайского и английского языков, и насколько я знаю, нет никакого способа разобраться, что есть в XSLT/XSL-FO.

Можно ли встроить один шрифт для покрытия всех ситуаций? На данный момент мне просто нужен английский и китайский, но мне, вероятно, придется продлить это в будущем.

Я использую Apache FOP 2.1 и Java 1.7.0_91 на Ubuntu. Я видел некоторые более ранние вопросы по подобной теме, но большинство из них, похоже, использует гораздо более старую версию Apache FOP (например, 0.95 или 1.1), и я не знаю, было ли что-то изменено/улучшено тем временем.

Редактировать: У меня вопрос (я думаю) на предлагаемый дубликат. Я перешел на использование Ubuntu Font Family, используя следующий код в моем ФОП конфигурации:

<font kerning="yes" embed-url="../fonts/ubuntu/Ubuntu-R.ttf" embedding-mode="full"> 
    <font-triplet name="Ubuntu" style="normal" weight="normal"/> 
</font> 

<font kerning="yes" embed-url="../fonts/ubuntu/Ubuntu-B.ttf" embedding-mode="subset"> 
    <font-triplet name="Ubuntu" style="normal" weight="bold"/> 
</font> 

Однако, я все еще получаю «глифов не доступно» предупреждение:

Jan 31, 2016 10:22:59 AM org.apache.fop.events.LoggingEventListener processEvent 
WARNING: Glyph "你" (0x4f60) not available in font "Ubuntu". 
Jan 31, 2016 10:22:59 AM org.apache.fop.events.LoggingEventListener processEvent 
WARNING: Glyph "好" (0x597d) not available in font "Ubuntu". 

Я знаю, что Ubuntu Regular имеет эти два символа, потому что это мой стандартный системный шрифт.

Редактировать 2: Если я использую GNU Unifont, глифы отображаются правильно. Тем не менее, это, скорее всего, шрифт, предназначенный больше для консольного использования, чем в документах.

+0

Как 2 любое отличие от 1? https://xmlgraphics.apache.org/fop/2.0/fonts.html предлагает шрифты OpenType ttf/otf поддерживаются просто отлично, поэтому вам, вероятно, следует сначала попробовать это. Возможно, вы не сможете использовать все функции OpenType, но если вы положитесь на них, FOP не будет вашей технологией выбора в любом случае. –

+0

В подобных вопросах пользователи успешно сообщили Arial Unicode для документов, содержащих разные языки (я уверен, что есть и другие шрифты). – lfurini

+1

Arial Unicode - проблема для меня из-за лицензионных ограничений (мне нужно иметь возможность отправлять любые встроенные шрифты, которые я использую с программным обеспечением). Я пробовал использовать Ubuntu Regular, который определенно отображает 你好 правильно, когда я использую его в своей системе, но я все равно получаю предупреждение о недоступности глифа. – pwaring

ответ

0

Ответ на мой вопрос или использовать GNU Unifont, что:

  1. Поддержка китайский и английский.
  2. Доступен под бесплатной лицензией.
  3. «Просто работает», если вы добавите его в конфигурационный файл FOP.

Или, альтернативно, создайте отдельные шаблоны для PDF-файлов на английском и китайском языках и используйте разные шрифты для каждого.

2

Если вы не можете найти подходящий шрифт, поддерживающий как китайский и английский (или вы нашли один, но вам не очень нравятся ее латинские глифы), помните, что font-family может содержать разделенный запятыми список имен, который будет использоваться в этом порядке.

Таким образом, вы можете перечислить свой шрифт для английского текста первого, а затем один для китайского текста:

<!-- this has # instead of the missing Chinese glyphs --> 
<fo:block font-family="Helvetica" space-after="1em" background-color="#AAFFFF"> 
    Paul 你好</fo:block> 

<!-- this has all the glyphs, but I don't like its latin glyphs --> 
<fo:block font-family="SimSun" space-after="1em" background-color="#FFAAFF"> 
    Paul 你好</fo:block> 

<!-- the best of both worlds! --> 
<fo:block font-family="Helvetica, SimSun" space-after="1em" background-color="#FFFFAA"> 
    Paul 你好</fo:block> 

Результат выглядит следующим образом:

screenshot of PDF output

+0

Я не знал, что вы можете использовать такие шрифты , Я подумал, что это случай использования первого шрифта в списке, а второй будет использоваться только в том случае, если первый не был установлен/внедрен. – pwaring

Смежные вопросы