Apache FOP中的印度字体支持

时间:2019-01-28 09:51:12

标签: java true-type-fonts apache-fop

在我的Java应用程序中使用Apache FOP 2.2通过mangal.ttf打印PDF中的印地语字符串时,某些印地语字符无法正确显示。
我正在使用JDK 1.8和spring MVC。

我尝试过lohit.ttf,devanagari.ttf,aparajita.ttf和kokila.ttf,但都遇到相同的问题。

情况1:

按以下方式设置fop-conf.xml时:

<font kerning="yes"    embed-url="classpath:/mangal.ttf"   >
<font-triplet name="Mangal" style="normal" weight="normal"></font-triplet>
</font>   

结果:screenshot像这样显示से,如屏幕截图所示

case1

情况2:

按以下方式设置fop-conf.xml时:

<font kerning="yes"   metrics-url="classpath:/mangal.xml" embed-url="classpath:/mangal.ttf"   >
<font-triplet name="Mangal" style="normal" weight="normal"></font-triplet>
</font>

结果:案例1中列出的问题已解决,但我面临另一个问题,如以下屏幕截图所示

case2


使用以下示例文本,您可以在链接https://www.fonts.com/font/microsoft-corporation/aparajita上看到预期的输出:

से and ग्रामीण should be printed in pdf

我尝试过的其他事情:

  • 我尝试PDFOne生成PDF。还是同样的问题。 Windows似乎可以正确显示它。
  • 配置复杂脚本:<fop version="1.0"> <complex-scripts disabled="true"/> ... </fop>
  • 使用script属性:<fo:block font-family="ARIALUNI" script="dev2" > देवी ग्रामीण</fo:block>

FOP中是否缺少我需要的任何配置设置?

1 个答案:

答案 0 :(得分:0)

更简短的答案:

如果配置了字体但输出不正确,则可能是FOP错误地确定要使用哪种脚本模式

解决方案::使用scriptstandard脚本代码在FO文件中显式设置extended属性。
请注意,印度脚本同时具有标准代码和扩展代码(例如Devanagari的devadev2),并且输出结果不同,因此您可能需要尝试他们两个,然后选择合适的一个。

更长的答案:

我没有您提到的字体,因此我使用Amiko Google Open字体进行了测试。
更重要的是,我对devanagari脚本一无所知,所以我真的不能说输出是正确还是错误,我只能将其与您的图像进行比较。

这是我使用的完整的输入文件,其中的句子是从您的问题中复制来的:

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
      <fo:region-body/>
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="simpleA4">
    <fo:flow flow-name="xsl-region-body">
      <fo:block font-family="Amiko" script="deva">deva: से and ग्रामीण should be printed in pdf</fo:block>
      <fo:block font-family="Amiko" script="dev2">dev2: से and ग्रामीण should be printed in pdf</fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

这是最小的配置

<?xml version="1.0"?>
<fop version="1.0">
  <renderers>
    <renderer mime="application/pdf">
      <fonts>
        <font kerning="yes" embed-url="Amiko/Amiko-Regular.ttf">
          <font-triplet name="Amiko" style="normal" weight="normal"/>
        </font>
      </fonts>
    </renderer>
  </renderers>
</fop>

产生此输出

output with complex script ON

如果我理解正确,那么您尝试实现的输出就是带有script="deva"的输出。


请注意,您的配置中不需要metrics-url属性。

此外,将<complex-scripts disabled="true"/>放入您的配置中会导致禁用“复杂脚本”支持,因此我希望这会产生错误输出。

配置

<?xml version="1.0"?>
<fop version="1.0">
  <complex-scripts disabled="true"/>
  <renderers>
    <renderer mime="application/pdf">
      <fonts>
        <font kerning="yes" embed-url="Amiko/Amiko-Regular.ttf">
          <font-triplet name="Amiko" style="normal" weight="normal"/>
        </font>
      </fonts>
    </renderer>
  </renderers>
</fop>

产生以下输出

enter image description here