我有一个实现,其中JasperViewer
用于预览和保存报告。观看者提供的第一种保存格式是.jrprint
,我正在尝试将其更改为pdf
。我正在采用以下方法来解决这个问题
private static void promotePdfSaveFormat(JasperViewer jasperViewer) {
/* get via reflection (with jOOR) the parameter JasperViewer object's member viewer (of type JRViewer) */
JRViewer viewer = on(jasperViewer).call("viewer").get();
/* get via reflection JRViewer object's member tlbToolBar (of type JRViewerToolbar) */
JRViewerToolbar tlbToolBar = on(viewer).call("tlbToolBar").get();
/* call tlbToolBar's getSaveContributors() */
Arrays.stream(tlbToolBar.getSaveContributors()).forEach(
e -> {
/* Find the one that is of type JRPdfSaveContributor (using instanceof) */
if (e instanceof JRPdfSaveContributor){
/* set JRViewerToolbar object member lastSaveContributor value to the instance of JRPdfSaveContributor */
on(tlbToolBar).call("lastSaveContributor").get();
}
}
);
}
每次在JasperViewer viewer = new JasperViewer(...)
之类的类中创建新对象时,我都会在其后立即添加promotePdfSaveFormat(viewer)
。运行应用程序时,我在JRViewer viewer = on(jasperViewer).call("viewer").get();
错误如下
org.joor.ReflectException: java.lang.NoSuchMethodException: No similar method viewer with params [] could be found on type class net.sf.jasperreports.view.JasperViewer.
答案 0 :(得分:1)
它们被称为JRSaveContributor。
您可以设置自己的JRViewer.setSaveContributors
或重新排序(删除)的一种简便方法是获取实例化的对象,然后循环检查说明以查看您想要保留/重新排序的内容,然后进行设置回到JasperViewer
。
快速示例,首先设置pdf。
final JRViewer jrv = new JRViewer(report);
JRSaveContributor[] sv = jrv.getSaveContributors();
List<JRSaveContributor> reorded = new ArrayList<JRSaveContributor>();
for (JRSaveContributor s : sv) {
if (s.getDescription().contains(".pdf")){
reorded.add(0,s);
}else{
reorded.add(s);
}
}
jrv.setSaveContributors((JRSaveContributor[]) reorded.toArray(new JRSaveContributor[reorded.size()]));
您可能还想跳过
.jrprint
?如果您使用的是Java8,则可以使用流来改进此代码,我将该练习留给读者。
结果
答案 1 :(得分:0)
经过仔细检查,我意识到自己犯了一个非常愚蠢的错误。之所以会抛出$author = $this->getReference('author-reference');
是因为以下几行试图访问NoSuchMethodException
而不是method
。
field
然后,我修改了方法,以访问JRViewer viewer = on(jasperViewer).call("viewer").get();
JRViewerToolbar tlbToolBar = on(viewer).call("tlbToolBar").get();
。整个方法现在看起来像这样:
field
现在,private static void promotePdfSaveFormat(JasperViewer jasperViewer) {
/* get via reflection the parameter JasperViewer object's member viewer (of type JRViewer) */
JRViewer viewer = on(jasperViewer).field("viewer").get();
/* get via reflection JRViewer object's member tlbToolBar (of type JRViewerToolbar) */
JRViewerToolbar tlbToolBar = on(viewer).field("tlbToolBar").get();
/* call tlbToolBar's getSaveContributors() */
Arrays.stream(tlbToolBar.getSaveContributors())
/* filter instance of type JRPdfSaveContributor */
.filter(e -> e instanceof JRPdfSaveContributor)
/* set JRViewerToolbar object member lastSaveContributor value to the instance of JRPdfSaveContributor */
.forEach(e -> on(tlbToolBar).set("lastSaveContributor", e));
}
显示JasperViewer
作为第一个保存选项。