2016-11-28 6 views
1

JasperReportsを使用して、Javaを使用して動的にレポートを作成しています。画像表現(画像パス)に問題があります。イメージの式を設定して、正しいイメージのパスを常に格納する方法

JRDefaultStyleProvider JRDefaultStyleProvider = null; 
JRDesignImage image = new JRDesignImage(JRDefaultStyleProvider); 
image.setX(0); 
image.setY(0); 
image.setWidth(200); 
image.setHeight(200); 
exp = new JRDesignExpression(); 
**exp.setText("\"D:/MyProgram/src/myprogram/images/logo.png\"");** 
image.setExpression(exp); 
image.setStyle(styles.imageStyle); 
title_band.addElement(image); 

それは正常に動作しますが、私はMYPROGRAMの場所を変更する場合、私はまた、式の中でパスを変更する必要があります:これは私が今それを渡す方法です。 式を../images/logo.pngに設定しようとしましたが、「バイトデータが見つかりません:../images/logo.png」というエラーが発生しました。どんな助けもありがとう。

答えて

2

あなたができることはいくつかあります。

レポートにProjectRootというパラメータを手動で追加するには、イメージ式として$P{ProjectRoot} + "images/logo.png"を使用し、レポートを実行するときにProjectRoot(環境から取得)の値を渡します。

もう1つの方法は、JasperReportsもイメージの場所をクラスローダーのリソースとして解決しようとしているという事実を活用することです。したがってsrc/myprogramをソースフォルダとして追加すると、実行時にimages/logo.pngがプロジェクトのクラスパスに含まれるようになると、"images/logo.png"をイメージ式として使用できるようになります。

第3の解決方法は、JasperReportsContextインスタンス内にFileRepositoryServiceという拡張子を登録して、レポートを埋め込むことです。ファイルリポジトリサービスは、環境から何らかの形で判断する必要がある、現在のプロジェクトのルートパスで作成されます。リポジトリサービスを使用すると、"images/logo.png"をイメージ式として使用することもできます。コードは次のようになります。

SimpleJasperReportsContext context = new SimpleJasperReportsContext(); 
FileRepositoryService fileRepository = new FileRepositoryService(context, "D:/MyProgram/src/myprogram/", false); 
context.setExtensions(RepositoryService.class, Collections.singletonList(fileRepository)); 
context.setExtensions(PersistenceServiceFactory.class, Collections.singletonList(FileRepositoryPersistenceServiceFactory.getInstance())); 

JasperPrint jasperPrint = JasperFillManager.getInstance(context).fill(jasperReport, params); 
関連する問題