Я не могу изменить семейство шрифтов, используя Apache FOP - PullRequest
4 голосов
/ 15 сентября 2011

Я использую fop Краткое руководство по началу работы , чтобы напечатать простой файл PDF из простого файла XML, и он отлично работает. но когда я изменяю <name>Frank</name> на <name>امیررضا</name> (изменить имя на другую кодировку), я получаю #### в своем распечатанном PDF. Я ищу в интернете и не нашел подходящего решения. Я использую многие конфигурационные файлы, вот некоторые из моих конфигурационных файлов:

Я использую эту команду для создания PDF:

fop -c cfg.xml -xml name.xml -xsl name2fo.xsl -pdf name.pdf

Когда я использую эту команду, я получаю предупреждение ниже:

WARNING: xHeight value could not be determined. The font may not work as
Sep 15, 2011 9:15:37 AM org.apache.fop.events.LoggingEventListener proce
WARNING: Glyph "╙" (0x633, afii57427) not available in font "Helvetica".
Sep 15, 2011 9:15:37 AM org.apache.fop.events.LoggingEventListener proce
WARNING: Glyph "╘" (0x634, afii57428) not available in font "Helvetica".

1- name.xml содержит:

<name>امیررضا</name>

2-name2fo.xsl содержит:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name="A4-portrait"
              page-height="29.7cm" page-width="21.0cm" margin="2cm">
          <fo:region-body/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="A4-portrait">
        <fo:flow flow-name="xsl-region-body">
          <fo:block>
            Hello, <xsl:value-of select="name"/>!
          </fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

3 - есть много разных конфигурационных файлов (cfg.xml).

3,1

<fop version="1.0">
<renderers>
    <renderer mime="application/pdf">      
      <fonts>
        <substitutions>
         <substitution>
            <from font-family="Helvetica" />
            <to font-family="SansSerif"/>
         </substitution>
        </substitutions>
        <referenced-fonts>
            <match font-family=".*"/>        
        </referenced-fonts>     
           <!-- register all the fonts found in a directory and all of its sub directories (use with care) -->
        <directory recursive="true">G:\....\fop\fop-1.0\Core14_AFMs</directory>

         <!-- automatically detect operating system installed fonts -->
        <auto-detect/>  
      <font embed-url="C:\WINDOWS\Fonts\times.ttf">
        <font-triplet name="Times New Roman" style="normal" weight="normal"/>
      </font>
      </fonts>
    </renderer>
  </renderers>
</fop>

3,2

<fop version="1.0">
<renderers>
    <renderer mime="application/pdf">      
      <fonts>
        <substitutions>
         <substitution>
            <from font-family="Helvetica" />
            <to font-family="SansSerif"/>
         </substitution>
        </substitutions>
        <referenced-fonts>
            <match font-family=".*"/>        
        </referenced-fonts>               

         <!-- automatically detect operating system installed fonts -->
        <auto-detect/>  
      </fonts>
    </renderer>
  </renderers>
</fop>

3,3: ......

Результат вывода:

Здравствуйте, #######!

Может кто-нибудь помочь мне это исправить?

Ответы [ 4 ]

2 голосов
/ 12 декабря 2012

Поддержка языков, написанных с использованием скриптов с написанием справа налево, таких как арабский и иврит, и полная поддержка биди была добавлена ​​в Apache FOP 1.1. На основании даты этого вопроса использовалась более старая версия Apache FOP. Для получения дополнительной информации см. http://xmlgraphics.apache.org/fop/trunk/complexscripts.html.

0 голосов
/ 15 сентября 2011

Я бы порекомендовал вам использовать HelveticaWorld, который также содержит арабские символы, или если вы создаете вход FOP динамически, то вы можете использовать переменные Velocity или Freemarker для хранения имени шрифта.

0 голосов
/ 17 сентября 2011

Я решаю эту проблему, добавив семейство шрифтов в коде XSL:

name2fo.xsl после изменений содержит:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name="A4-portrait"
              page-height="29.7cm" page-width="21.0cm" margin="2cm">
          <fo:region-body/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="A4-portrait">
        <fo:flow flow-name="xsl-region-body">
          <fo:block font-size="10pt" font-family="Tahoma">
            Hello, <xsl:value-of select="name"/>!
          </fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

Но у меня все еще есть проблема - мой персонаж фарси напечатан вобратный порядок.Я имею в виду, что если я хочу напечатать «Hello», он был напечатан «oellH» (вы можете себе представить, что «Hello» написан на языке фарси), а также у меня есть вторая проблема, заключающаяся в том, что этот символ был напечатан отдельно.

0 голосов
/ 15 сентября 2011

Я никогда не использовал Apache FOP, но нашел эту статью, которая позволяет вам создавать PDF на нескольких языках.

...