2016-08-22 20 views
4

Jasper ReportsでDateをフォーマットしようとしましたが、Windowsでは動作しますが、Linuxでは動作しません。 Linuxの場合、結果のテキストは切り捨てられます。LinuxでPDFでテキストが切り詰められるのはなぜですか?

コード:

JRXML:

<parameter name="timestamp" class="java.util.Date"/> 
[...] 
<textField> 
    <reportElement x="0" y="0" width="50" height="16" uuid="0007846a-26f1-457a-a198-67a2f7c8417c"> 
     <property name="local_mesure_unitwidth" value="pixel"/> 
     <property name="com.jaspersoft.studio.unit.width" value="px"/> 
     <property name="local_mesure_unitx" value="pixel"/> 
     <property name="com.jaspersoft.studio.unit.x" value="px"/> 
     <property name="local_mesure_unity" value="pixel"/> 
     <property name="com.jaspersoft.studio.unit.y" value="px"/> 
     <property name="local_mesure_unitheight" value="pixel"/> 
     <property name="com.jaspersoft.studio.unit.height" value="px"/> 
    </reportElement> 
    <box padding="2"/> 
    <textElement textAlignment="Left" verticalAlignment="Top"> 
     <font size="8" pdfFontName="Helvetica" pdfEncoding="Cp1250" isPdfEmbedded="true"/> 
    </textElement> 
    <textFieldExpression><![CDATA[DATEFORMAT($P{timestamp},"dd.MM HH:mm")]]></textFieldExpression> 
</textField> 

Mavenの依存関係:

<dependency> 
    <groupId>net.sf.jasperreports</groupId> 
    <artifactId>jasperreports</artifactId> 
    <version>5.6.0</version> 
</dependency> 
<dependency> 
    <groupId>net.sf.jasperreports</groupId> 
    <artifactId>jasperreports-functions</artifactId> 
    <version>5.6.0</version> 
</dependency> 

のJava:

private byte[] createPdf() { 

    try { 
     InputStream is = getClass().getResourceAsStream("MyReport.jasper"); 
     JasperReport jasperReport = (JasperReport) JRLoader.loadObject(is); 
     Map<String, Object> parameters = new HashMap<String, Object>(); 
     parameters.put("timestamp", new Date()); 
     JRDataSource jrDataSource = new JRBeanCollectionDataSource(new Vector(), false); 
     JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource); 
     byte[] pdf = JasperExportManager.exportReportToPdf(jasperPrint); 
     return pdf; 
    } catch (JRException e) { 
     throw new RuntimeException("Could not create PDF.", e); 
    } 
} 

結果:Windowsとの

結果:Linuxで

Windows

結果:

Linux

PDFのプロパティ:

どちらも生成されたPDFファイルは、Windows用のAcrobat Readerで同じフォントプロパティを持っている:あなたが見ることができるように

PDF properties

は、フォントが埋め込まれていません。依存関係jasperreports-fontsを追加し、属性pdfFontName,pdfEncodingおよびisPdfEmbeddedを削除すると、2番目のフォント "Helvetica"が消えます。

研究:私が読ん

およびソリューションは、フォントを埋め込むことのようですが、それはしていません作業。

私は、デフォルトのフォントの一つであり、それが理由です、 Wikipedia参照フォント「ヘルベチカ」を使用

:同じメトリックで

これらのフォント、または適切な代替フォントは、常にすべてのPDFで使用可能でなければなりません読者ので、PDF

https://stackoverflow.com/a/27345103/5277820に埋め込まれていない必要があります:あなたはiTextの、iTextのワットでこれらのフォントを使用する場合は

Adobe Readerや他の閲覧者がこれらのフォントを正しくレンダリングできると想定するのは安全ですから、埋め込みパラメータは無視してください。

質問:

なぜWindowsとLinuxと同じフォント異なる幅を持っていますか?あるいは、テキストの切り詰めや折り返しが異なるのはなぜですか?

+1

問題を避けるため、フォントを埋め込むことになっています。ポストhttp://stackoverflow.com/a/26632606/5292302で4つのミスを参照してください(答えはitextの創設者からです)、最良の例ではありませんが、コーディング練習の考え方、常に、提供され、埋め込まれたフォント –

答えて

3

フォントメトリックを正しく計算するには、フォントをJava仮想マシンに使用する必要があります。

この歴史的な質問を参照してください:あなたは、分散jasperreports-font.jarを使用する場合は碧玉-報告と正解が使用フォント、拡張

にあるしかしFont is not available to the JVM with Jasper Reports

を立ち上げ、古いエラーに様々なソリューションを表示それは、これらのフォントが含まれています:

そしてDejaVuなき
そしてDejaVuセリフ
そしてDejaVuなきモノ

あなたは、フォント名の例 fontName="DejaVu Sans"ではこれらのいずれかを使用する必要が

は、他のフォントへの自動マッピングが存在しない、jarファイルは、物理的にこれらの.ttfなしその他のみを含む(オープン瓶をし、碧玉、レポートの異なるバージョンの検証します) 。

したがって、pcにインストールされたフォントまたはfont-extensionに含まれているフォントのみがJVMで使用できます。

他のフォントが必要な場合は、IDE内から有効な.ttfフォントを含む独自のフォント拡張子を生成することをお勧めします。

0

クライアントシステムで特定のフォントを使用できると仮定しないでください。市販のデスクトップオペレーティングシステムが数種類しかなく、よく知られたフォントリスト何十年も安定していた。

新しいフォントを作成する方がはるかに簡単で、ユーザーは言語固有のフォントでコンテンツにアクセスし、数年ごとに新しいフォームファクタを起動し(新しいバニティフォントで)、Unicode.orgは新しい仕様をリリースします(既存のフォントを見直す必要があります)、その結果、異なるシステムに存在する実際のフォントは大きく異なります。

OSXとWindowsは以前の「固定フォントリスト」モードではやや機能しますが、新しいエントリーはありません。

PDFの場合、ドキュメントにフォントを埋め込む必要があります。 ウェブでは、正確なピクセル文字の寸法に依存しない柔軟なサイトデザインを意味します。いずれかのクライアントが、それがすべてでインストールされていないだろう、と異なるグリフメトリクスで何かにそれをエイリアスになる、またはそれは、古代のバージョンがあります:ヘルベチカまたはArialのような古いレガシーフォントを使用しようと

は病的なケースですそれは、ASCIIが好意を失ってから追加されたすべてのコードポイントが欠如しており、現代の国際的なテキストを表現することができなくなります。 Arialは長いウィンドウの支配のために動作する可能性は少し高いですが、それはすぐに侵食されます。

関連する問題