Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApacheFop使用SimSun显示####_Java_Apache Fop_Chinese Locale - Fatal编程技术网

Java ApacheFop使用SimSun显示####

Java ApacheFop使用SimSun显示####,java,apache-fop,chinese-locale,Java,Apache Fop,Chinese Locale,我正在维护一个使用ApacheFOP打印PDF文档的程序。有一些人抱怨说汉字的名字是“#####”。我已经找到了一个关于这个问题的现有线索,并在我这方面做了一些研究 我的系统上确实安装了uming.tff语言文件。与此线程中的人不同,我仍然得到“#####” 从现在开始,有没有人看到过一种解决方法,可以让您使用ApacheFop在PDF文档中打印复杂字符?要在使用FOP创建的PDF文件中正确显示汉字,必须采取三个步骤(对于默认字体中不可用的所有字符也是如此,更一般地说,对于使用非默认字体也是如

我正在维护一个使用ApacheFOP打印PDF文档的程序。有一些人抱怨说汉字的名字是“#####”。我已经找到了一个关于这个问题的现有线索,并在我这方面做了一些研究

我的系统上确实安装了uming.tff语言文件。与此线程中的人不同,我仍然得到“#####”


从现在开始,有没有人看到过一种解决方法,可以让您使用ApacheFop在PDF文档中打印复杂字符?

要在使用FOP创建的PDF文件中正确显示汉字,必须采取三个步骤(对于默认字体中不可用的所有字符也是如此,更一般地说,对于使用非默认字体也是如此)

让我们使用这个简单的fo示例来显示FOP在出现问题时产生的警告:

<?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="one">
            <fo:region-body />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="one">
        <fo:flow flow-name="xsl-region-body">
            <!-- a block of chinese text -->
            <fo:block>博洛尼亚大学中国学生的毕业论文</fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>
如果FO文件中没有任何明确的字体系列指示,FOP默认使用Helvetica,这是其中一种(在任何地方都可用的字体,因此不需要嵌入它们)

每种字体都支持一组字符,为它们指定一个可见的字形;当字体不支持字符时,会产生上述警告,PDF显示“#”,而不是缺少的字形

步骤1:在FO文件中设置字体系列 如果默认字体不支持文本字符(或者我们只是想使用不同的字体),我们必须使用
font-family
属性来声明所需的字体

font-family
的值是继承的,因此如果我们想在整个文档中使用相同的字体,我们可以在
fo:page-sequence
上设置属性;如果我们只需要为某些段落或单词使用特殊字体,我们可以在相关的
fo:block
fo:inline
上设置
font-family

因此,我们的输入变成(以我的字体为例):

FOP不知道如何将“SimSun”映射到字体文件,因此它默认为不支持中文字符的通用Base-14字体(Times Roman),并且PDF仍然显示“#”

步骤2:在FOP的配置文件中配置字体映射 在FOP的文件夹中,文件
conf/FOP.xconf
是一个示例配置;我们可以直接编辑它或制作一个副本开始

配置文件是一个XML文件,我们必须添加内部的
/fop/renderers/renderer[@mime='application/pdf']/font/
(每个可能的输出mime类型都有一个
renderer
部分,因此请检查是否在右侧插入映射):

从java代码中,我们可以使用(另请参见):

现在,PDF最终应该正确使用所需的字体,并按预期显示

如果FOP突然终止,出现如下错误:

org.apache.fop.cli.Main startFOP
SEVERE: Exception org.apache.fop.apps.FOPException: Failed to resolve font with embed-url '/Users/furini/Library/Fonts/doesNotExist.ttf'
这意味着FOP找不到字体文件,需要再次检查字体配置;典型的原因是

  • 字体url中的输入错误
  • 权限不足,无法访问字体文件

这部分帮助解决了我在PDF中显示日语的问题。但是“Arial Unicode MS”在我的xslt页面中,sequnce明确指出了这一点。是否可以在没有配置文件的情况下显示Japanse语言?我们正在为不同的语言使用属性包,并为所有其他语言工作。我想使用支持包括Japsnsse在内的所有语言的字体。是否可能?@RKG:不,如果没有字体配置,您无法嵌入fo“base 14”字体不支持nts和日语字符;但是,如果您能找到一种同时支持拉丁和日语字符的字体,您可以将相同的字体配置为用于所有语言(另一条评论提到Arial Unicode MS,值得一试)。是的,使用Arial Unicode MS字体创建配置文件后工作正常。如何在配置文件中指定ttf文件路径?我的字体文件位于/webapp/src/main/resources/fonts/ARIALUNI.ttf下,配置文件位于/webapp/src/main/resources/fop.xconf下。目前我使用的是“Arial Unicode MS”字体系列。
<?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="one">
            <fo:region-body />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="one">
        <fo:flow flow-name="xsl-region-body">
            <!-- a block of chinese text -->
            <fo:block font-family="SimSun">博洛尼亚大学中国学生的毕业论文</fo:block>
        </fo:flow>
    </fo:page-sequence>
</fo:root>
org.apache.fop.events.LoggingEventListener processEvent
WARNING: Font "SimSun,normal,400" not found. Substituting with "any,normal,400".
org.apache.fop.events.LoggingEventListener processEvent
WARNING: Glyph "?" (0x535a) not available in font "Times-Roman".
...
<?xml version="1.0"?>
<fop version="1.0">
  ...
  <renderers>
    <renderer mime="application/pdf">
      ...
      <fonts>

        <!-- specific font mapping -->
        <font kerning="yes" embed-url="/Users/furini/Library/Fonts/SimSun.ttf" embedding-mode="subset">
          <font-triplet name="SimSun" style="normal" weight="normal"/>
        </font>

        <!-- "bulk" font mapping -->
        <directory>/Users/furini/Library/Fonts</directory>

      </fonts>
      ...
    </renderer>
    ...
  </renderers>
</fop>
$ fop -c /path/to/our/fop.xconf input.fo input.pdf
fopFactory.setUserConfig(new File("/path/to/our/fop.xconf"));
org.apache.fop.cli.Main startFOP
SEVERE: Exception org.apache.fop.apps.FOPException: Failed to resolve font with embed-url '/Users/furini/Library/Fonts/doesNotExist.ttf'