5

jasper レポートでカスタム フォントを使用しようとしています。Myanmar3ミャンマーの標準フォントです。すべて問題ありませんが、一緒でReportTitleなければなりません。 ミャンマーのロケールにも使用します。Myanmar FontMyanmar3GoogleMyanmar3

レポートをhtmlファイルとしてエクスポートする場合。レポートのタイトルは表示できますが、エクスポートされたPDFファイルは正しく表示されません。

ブラウザで。

ここに画像の説明を入力

PDFで

ここに画像の説明を入力

public void report() throws Exception {
    List<SalesReport> saleReports = salesReportService.findSalesReport(new SalesReportCriteria());
    InputStream inputStream = new FileInputStream("report-template/saleReportTemplate.jrxml");
    String outputFilePdf = "D:/temp/BasicReport.pdf";
    String outputFileHtml = "D:/temp/BasicReport.html";
    Map paramMap = new HashMap();
    paramMap.put("ReportTitle", "\u1005\u101B\u1004\u103A\u1038\u1021\u1004\u103A\u1038\u1019\u103B\u102C\u1038\u1011\u100A\u103A\u101E\u103D\u1004\u103A\u1038\u1001\u103C\u1004\u103A\u1038");
    paramMap.put("TableDataSource", new JRBeanCollectionDataSource(saleReports));
    JasperDesign jasperDesign = JRXmlLoader.load(inputStream);
    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, paramMap, new JRBeanCollectionDataSource(saleReports));
    JasperExportManager.exportReportToPdfFile(jasperPrint, outputFilePdf);
    JasperExportManager.exportReportToHtmlFile(jasperPrint, outputFileHtml);
}

saleReportTemplate.jrxml

<?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="TableReport" pageWidth="842" pageHeight="595" orientation="Landscape" whenNoDataType="AllSectionsNoDetail" columnWidth="802" 
              leftMargin="20" rightMargin="20" topMargin="30" bottomMargin="30" isFloatColumnFooter="true" whenResourceMissingType="Empty" uuid="a255c602-4ff1-4db8-ab72-65b5c3ff9bdd">

    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <style name="Myanmar3" isDefault="true" fontName="Myanmar3" fontSize="10" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false"/>
    <style name="Table">
        <box leftPadding="0">
            <pen lineWidth="1.0" lineColor="#000000"/>
        </box>
    </style>
    <style name="TableHeader" mode="Opaque" backcolor="#808080"/>
    <style name="TableFooter" mode="Opaque" backcolor="#C0C0C0"/>
    <subDataset name="TableData" uuid="41cd3dac-2d22-41b9-9872-8fdb465d0f85">
        <field ... for table generation/>
    </subDataset>
    <parameter name="TableDataSource" class="net.sf.jasperreports.engine.JRDataSource"/>
    <parameter name="ReportTitle" class="java.lang.String" isForPrompting="false"/>
    <title>
        <band height="153">
            <textField isBlankWhenNull="true">
                <reportElement uuid="b44cb7c1-f7d5-467c-8982-b95f65dcb849" x="106" y="0" width="573" height="59"/>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font size="22" isBold="true" isPdfEmbedded="true"/>
                </textElement>
                <textFieldExpression><![CDATA[$P{ReportTitle}]]></textFieldExpression>
            </textField>
            <componentElement>
                -->other tag for table....
            </componentElement>
        </band>
    </title>
</jasperReport>

MYANMAR3.TTF私はすでにファイルを追加し、フォントjasperreports-fonts-5.1.0.jar用に構成しています。myanmar3

jasperreports_extension.properties

net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.dejavu=net/sf/jasperreports/fonts/fonts.xml
net.sf.jasperreports.extension.simple.font.families.myanmar3=net/sf/jasperreports/fonts/fonts.xml

font.xml

...other default config.

<fontFamily name="Myanmar3">
    <normal>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</normal>
    <bold>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</bold>
    <italic>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</italic>
    <boldItalic>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</boldItalic>
    <pdfEncoding>Identity-H</pdfEncoding>
    <pdfEmbedded>true</pdfEmbedded>
</fontFamily>

非常に多くの構成、参照、および例をテストしました。ただし、PDFファイルへの影響はありません。

何か提案や提供があれば教えてください。

4

2 に答える 2

3

これは、iText (バージョン テスト済み 5.5.4) とttfフォントの問題です。itextは合字をサポートしていません。以下のコメントを参照してください。

jasper-reports は itext をライブラリとして使用して pdf をレンダリングしているため、この問題を解決するために jasper report でできることは何もありません。

iText のみを使用したサンプル コードは、ジャスパー レポートと同じ出力をレンダリングします。

public class FontTest {

    /** The resulting PDF file. */
    public static final String RESULT = "pdf/fontTest.pdf";
    /** Test text. */
    public static final String TEST = "\u1005\u101B\u1004\u103A\u1038\u1021\u1004\u103A\u1038\u1019\u103B\u102C\u1038\u1011\u100A\u103A\u101E\u103D\u1004\u103A\u1038\u1001\u103C\u1004\u103A\u1038";

    public void createPdf(String filename) throws IOException, DocumentException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
        document.open();
        BaseFont bf = BaseFont.createFont(
            "lib/myanmar3.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(bf, 20);
        ColumnText column = new ColumnText(writer.getDirectContent());
        column.setSimpleColumn(36, 730, 569, 36);
        column.addElement(new Paragraph(TEST, font));
        column.go();
        document.close();
    }

    public static void main(String[] args) throws IOException, DocumentException {
        new FontTest().createPdf(RESULT);
    }
}

itext がフォントを正しくレンダリングできない理由を理解するために、itext セクションにフォローアップの質問をました。

これは@Bruno Lowagie (iText のオリジナル開発者) のコメントです。

「表示される動作は、iTextが合字をサポートしていないことが原因です。iTextの次の未リリース バージョンのいずれかが必要です。来年ベータ版をリリースしますが、顧客に限定します。」

于 2015-12-15T17:01:25.483 に答える
0

Jasper-report が使用しているテキスト レンダリング エンジンを確認できますか?

フォント 'Myanmar3' は、正しい文字シーケンスを生成するために OpenType 機能に大きく依存しています。かなり高いレベルでは、テキスト レンダリング エンジンは低レベルのルーチンに依存して、フォント内のグリフの描画を正しく処理します。つまり、最上位レベルでは、特定のテキスト文字列を描画するコマンドを与えます。この文字列は個別の文字に分解され、フォント内の OTF 規則に従って並べ替えられるか、グリフに置き換えられる可能性があります。その後、グリフの正しい文字列 (もはや「文字」ではありません) が返されて表示されます。

説明とスクリーン ショットから、ブラウザこのフォントで動作するようですが、Jasper レポートでは動作しません。これは PDF に表示されます。入力文字列は個別の基本グリフに正しく分解されます (または、分解された形式で提供されている可能性があります) が、基本グリフはテキスト レンダリング エンジンによって構成されたグリフに置き換えられません。したがって、いくつかのキャラクターの下に点線の円があります。これらは単なるプレースホルダーであり、描画されることを意図したものではありません。

正確な障害点を特定することはできません。フォント 'Myanmar3' にはcligligaサブテーブルに必要なすべての情報が含まれており、これら 2 つは特別なものではありません。ただし、script タグmymr、おそらくテキスト レンダリング エンジンがスクリプト固有の機能を認識していない可能性があります。もう 1 つの可能性は、機能コード自体を解釈できないことです。ここには、複雑なチェーン コンテキスト文字列がたくさんあるようです。

Jasper レポートのテキスト レンダリング エンジンを手動で変更することはできないと思いますか? この非常に低レベルの問題を開発者に転送することをお勧めします。

于 2013-07-28T23:49:11.447 に答える