【问题标题】:How to export fonts in Gujarati-Indian Language to pdf?如何将古吉拉特语-印度语的字体导出为 pdf?
【发布时间】:2016-04-13 13:42:50
【问题描述】:

我想在从 jasper 报告 5.1 版导出的 PDF 报告中显示不同的字体(古吉拉特语-印度语言)。

我尝试过的: 运行工具后打开以下位置 第 1 步:

工具 -> 选项 -> 字体

net.sf.jasperreports.default.font.name=Arial Unicode MS - the default     font name.
net.sf.jasperreports.default.font.size=10 - the default font size.
net.sf.jasperreports.default.pdf.font.name=Identity-H - the default PDF font.
net.sf.jasperreports.default.pdf.encoding=UTF-8 - the default PDF character encoding.
net.sf.jasperreports.default.pdf.embedded=true - by default PDF fonts are not embedded

字体“Arial Unicode MS”已安装,其 jar 文件也已创建。Jar 文件在 jasper 报告的类路径中退出。

链接已关注 :1) Fonts 2)Sample fonts

第 2 步:irfonts.xml

默认情况下,jasper 报告会在此文件中提供我将其更改为的其他字体。

<fontFamily name="Arial Unicode MS">
<normal>net/sf/jasperreports/fonts/dejavu/ArialUnicodeMS.ttf</normal>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>

第 3 步:

我得到什么结果: હીપ્સ 我真正想要的: હિપ્સ

花了一些时间后,我才知道当您在 Jasper 报告模板中呈现页面时,字体正在根据需要工作,但是当您将其导出为 pdf 时,它会更改原因所有字体都通过“itext pdf 引擎”。

现在,技巧是 itext 没有我当前使用的字体。

有没有什么方法可以实现。

注意事项: 它不是使用 Java 创建的。我是 Oracle 数据库开发人员,因此仅使用工具创建并使用工具边界打印。

也关注了这个博客,但它是在 java 中,所以不知道在哪里进行更改。 Blog of java

示例代码:

<textField>
<reportElement x="111" y="26" width="100" height="20" uuid="5a471a16-de7b-4f55-9c9f-b01d37938b9f"/>
 <textElement>
    <font fontName="Arial Unicode MS" pdfEncoding="Identity-H" isPdfEmbedded="true"/>
</textElement>
<textFieldExpression><![CDATA[$F{my_column_values}]]></textFieldExpression>

有些类似的问题也是栈溢出问题,但都是用java调用和打印的。

那么,我可以更改 itext 库还是任何其他解决方法都可以。 我是如何创建的:

1) Jasper report

2) Jasper

【问题讨论】:

  • I'm a Oracle Database Developer so created using tool only and printing withing tools boundaries. - 您使用 JasperReports 生成报告的方式是什么?你的任务是什么?
  • 基于数据源,它将使用我的数据库列,并基于我创建的列来呈现数据。
  • 你可以查看这个来缩小你的问题How can I test my font in pdfligatures的渲染问题
  • 注意你需要使用字体扩展看看这个how-can-i-render-hindi-correctly-when-exporting-to-pdf
  • 尝试缩小范围,然后你需要提供一个minimal reproducible example,一个最小的jrxml(也没有数据,例如使用标题带和一个参数),链接到ttf字体,当前结果和预期结果。这样我们就可以得到一个很好的问题,并可以为您提供一个体面的答案。

标签: fonts jasper-reports export-to-pdf


【解决方案1】:

试用 JasperReports 6.2.0 或更高版本。它带有对印度语脚本的 PDF 支持(通过将 AWT 文本布局传输到 PDF 来实现)。

JasperReports 发行版中的 Unicode 报告示例(在 demo/samples/unicode 下)以多种印度语脚本显示文本,包括古吉拉特语(使用 Google Noto 字体)。

【讨论】:

  • 我只能使用升级到 5.1 版。
  • @PranavShah,因为“实现真的很差”(它适用于您的示例,但可能不适用于其他示例),我真的建议您更新 jasper 报告并使用这种方法。
  • @PranavShah 我认为您发布了错误的问题,评论似乎与主题无关。
  • 在这里创建了一个新问题stackoverflow.com/questions/36710290/…
【解决方案2】:

我创建了一个仅与 itext 相关的新 question @AmedeeVanGasse 为 suggested 我将在此答案中展示如何在 jasper 报告中实现 Alexey Subach answer

注意:Alexy Subach 指出“实施非常糟糕 你不能指望用它得到正确的结果”

策略一:只需要导出pdf

添加到类路径 itext5 库(注意最新的 jasper 报告使用 itext2,您将需要两者)并将 GujaratiLigaturizer 类定义为变量,然后在每次需要输出时处理您的文本。

示例

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="FontTest" columnCount="5" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="111" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="2347c131-1884-430a-b77f-59f08f896c8a">
    <variable name="g" class="com.itextpdf.text.pdf.languages.GujaratiLigaturizer">
        <initialValueExpression><![CDATA[new com.itextpdf.text.pdf.languages.GujaratiLigaturizer()]]></initialValueExpression>
    </variable>
    <title>
        <band height="25">
            <textField pattern="">
                <reportElement x="0" y="0" width="200" height="25" uuid="ee49d149-394b-4ac6-a0a2-6d207b0c8d89"/>
                <textElement>
                    <font fontName="Arial Unicode MS" size="14"/>
                </textElement>
                <textFieldExpression><![CDATA[$V{g}.process("\u0ab9\u0abf\u0aaa\u0acd\u0ab8")]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

重要提示:只有pdf导出才是正确的!

PDF 结果

策略2:导出为pdf时切换文本

通过java导出前如果需要生成pdf,在导出前切换JasperPrint对象中的文字

JasperPrint print = JasperFillManager.fillReport(report, new HashMap<String, Object>(), theDatasource);
IndicLigaturizer g = new GujaratiLigaturizer();
for (JRPrintPage page : print.getPages()) {
    for (JRPrintElement element : page.getElements()) {
        if (element instanceof JRTemplatePrintText){
            JRTemplatePrintText text = (JRTemplatePrintText)element;
            text.setText(g.process(text.getText()));
        }
    }
}

【讨论】:

  • @peter 我在尝试预览 java.lang.ClassNotFoundException 时收到此错误:不会从默认包 (GujaratiLigaturizer) 加载类。以上实施后。
  • @PranavShah,你需要将 itext5 添加到你的类路径
  • 是的,我确实从这里下载了它,然后添加到类路径中... inTools-->option-> JasperReportProperties java2s.com/Code/Jar/i/Downloaditextpdf506sourcesjar.htm 之后创建了一个变量,该变量将具有您所说的值 Variable Class = GujaratiLigaturizer 和 initialValueExpression = com.itextpdf.text.pdf.languages.GujaratiLigaturizer
  • @PranavShah 嗯,这就是你需要的binsourceforge.net/projects/itext的来源,官方在github上但是我不知道在哪里......(sourceforge只是一个备份但会很好地为你服务)
  • 我收到这个错误 java.lang.ClassNotFoundException: Will not load classes from default package (GujaratiLigaturizer)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 2020-10-25
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
相关资源
最近更新 更多