【问题标题】:Java: Fonts look garbled on Linux, but fine on windowsJava:字体在 Linux 上看起来乱码,但在 Windows 上很好
【发布时间】:2009-09-01 05:44:12
【问题描述】:

我正在编写一个将 PDF 文档呈现为图像的 Java 应用程序,当我在 Windows 上运行它时,它运行良好。但是当我在 Linux 上渲染 PDF 时,标准字体看起来有点乱码,好像某些字符的右侧会丢失一些像素。

我只在全新安装的带有 OpenJDK 6 的 Ubuntu 9.04 上对其进行了测试,但我很确定我之前在 Linux 上遇到过类似的问题。我还尝试使用其他 Java PDF 应用程序打开 PDF,例如 SwingLabs PDFRenderer 和 IcePDF Demo Applet,它们也遇到了同样的问题。在 Windows 上,它们都可以很好地呈现文档。我还在同一台 Ubuntu 机器上使用默认的 PDF 查看器 evince 打开了文档。 Evince 呈现的文档没有字体问题,所以我很确定这是一个一般的 Java + Linux 问题。

为了比较:
This image 在 Windows 上呈现。
This image 在 Linux 上呈现。我用红圈标记了几个乱码。
This one也在Linux上渲染。似乎只有标准字体受到影响。

感谢任何帮助。

【问题讨论】:

标签: java linux pdf openjdk


【解决方案1】:

OpenJDK 必须推出受版权保护的字体。安装 Sun 的 Java,字体会更好一些。

【讨论】:

  • 成功了!我还安装了一个名为“Ubuntu restricted extras”的包,它使 OpenJDK 中的字体更好一些,但 Sun 的 JRE 渲染得更好。
【解决方案2】:

我在 Linux 中安装了 OpenJDK,所有应用程序的字体都非常非常糟糕……在多次尝试更改字体、抗锯齿、安装 Lucida 字体等之后,我发现我的问题出在/etc/fonts/conf.d/35-freefont.conf。

我只是删除了那个链接,运行 fc-cache -f,所有新的 Java 应用程序都得到了更好的字体。

在我的例子中,freefont 配置告诉 Java 使用它而不是更好的字体。如果您有类似的问题,只需运行 sudo mv /etc/fonts/conf.d /etc/fonts/conf.d.off 和 fc-cache -f 并测试...

如果它有效,您的默认字体替换也很糟糕,您应该恢复该目录并测试每个文件。

如果它保持不变,那么您可能还有另一个问题(不要忘记恢复 conf.d 目录)

更新

在 Ubuntu 12.04 上,我遇到了类似的问题,所有 Java 字体都是粗体。删除 /etc/fonts/conf.d/65-nonlatin.conf 解决了这个问题。

【讨论】:

    【解决方案3】:

    可能是字体提示变坏了。检查您正在使用的 Linux 操作系统的字体提示设置。

    也可以是字体——尝试指定不同的字体。您正在使用的那个可能只是在 Linux 上渲染得很糟糕——有些就是这样。 Palatino 是我发现特别糟糕的一种。

    【讨论】:

    • 我认为我不能轻易更改字体,因为它是在 PDF 文档中定义的,但字体提示听起来是个好主意。
    【解决方案4】:

    您可以尝试使用pdffonts 来帮助您分析问题 - 它至少会告诉您 PDF 文件中使用的字体的名称、它们的类型、是否嵌入等。如果字体没有嵌入您可以尝试将它们安装在 Linux 机器上。

    【讨论】:

      【解决方案5】:

      有 8 种标准字体系列您不需要嵌入,因为 PDF 查看器应该提供。否则他们将被替换。 PDF 在其他 PDF Java 开源查看器(Multivalent、JPedal)中是什么样子的?

      【讨论】:

      • 我在我的项目中使用了 JPedal,并且还使用 IcePDF Webstart Demo 和 Swinglabs PDFRenderer 对其进行了测试。他们有同样的问题。问题是 OpenJDK。我安装了 Sun JRE,一切正常。
      【解决方案6】:

      您可以使用 openJDK 并使用 Sun/Oracle 的字体!

      首先安装openDJK(运行时和开发包)

      然后只安装 Sun/Oracle 的运行时。这将安装字体,但您仍将使用 openJDK 的 java 来运行所有内容。

      【讨论】:

        【解决方案7】:

        安装最新版本的 OpenJDK。或者重新编译 Freetype 并启用提示。 Apple 有关提示的专利已过期。

        【讨论】:

          【解决方案8】:

          字体是否嵌入在 PDF 中?

          【讨论】:

          • 我认为乱码字体没有嵌入。 AFAIK PDF 标准定义了一些不会嵌入的标准字体。
          • 看来我错了。乱码字体可以嵌入。
          • 嵌入式字体还存在与 Java 相关的潜在问题,例如编码和专利问题。这取决于渲染器如何处理这些......
          【解决方案9】:

          尝试复制你所有的 windows 字体,并将它们放入你的 linux 环境中。

          【讨论】:

            【解决方案10】:

            我没有测试过,但是根据forum post at inductiveautomation.com,你可以通过安装字体来纠正它:

            sudo apt-get install msttcorefonts
            

            并在 Java 字体的属性中为 arial 更改 lucidasans:

            sudo nano /usr/lib/jvm/java-6-sun/jre/lib/fontconfig.properties
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-03-04
              • 1970-01-01
              • 2014-01-08
              • 2016-01-05
              • 2011-08-05
              • 1970-01-01
              相关资源
              最近更新 更多