环境:
jasperreports 5.0.0
ireport 5.1.0
1.IReport使用自带的Adobe中文字体会出现所有字会堆叠在一起问题
解决方法:安装自定义字体(如:windows下的字休,C:\Windows\Fonts)
工具-选项-Fonts,如下图:
2.报表的动态对象变量($V)、参数($P)、字段($F)都要先增加后再使用
3.Detail是做数据循环使用的,只能放字段$F(这个针对Spring生成HTML预览<非导出>),否则不能显示。(在IReport中Preview时不会出这种问题)
4.在动态填充数据时,图片路径做为参数时,不能用png格式图片(可能是 jasperreports 版本问题)
5.动态加载图片问题
问题描述:当在IReport中用image控件时,如果想要图片根据所传参数动态加载,做如下图设置:
这里当你Preview时logoUrl用本地、网络路径都可以(如demo.jpg、C:\demo.jpg、http: \\ireport.test.com\images\demo.jpg)但是当在Spring生成HTML预览时图片不显示,调试一看程序总是去找 IReport编译过的 img_0_0_1
解决方法:将上图的Is Lazy勾选上,如下图:
这时要注意的是,当再Preview的时候,参数logoUrl必须用网络路径(如:http:\\ireport.test.com\images\demo.jpg)
jasperreports 5.0.0
ireport 5.1.0
1.IReport使用自带的Adobe中文字体会出现所有字会堆叠在一起问题
解决方法:安装自定义字体(如:windows下的字休,C:\Windows\Fonts)
工具-选项-Fonts,如下图:
2.报表的动态对象变量($V)、参数($P)、字段($F)都要先增加后再使用
3.Detail是做数据循环使用的,只能放字段$F(这个针对Spring生成HTML预览<非导出>),否则不能显示。(在IReport中Preview时不会出这种问题)
4.在动态填充数据时,图片路径做为参数时,不能用png格式图片(可能是 jasperreports 版本问题)
5.动态加载图片问题
问题描述:当在IReport中用image控件时,如果想要图片根据所传参数动态加载,做如下图设置:
这里当你Preview时logoUrl用本地、网络路径都可以(如demo.jpg、C:\demo.jpg、http: \\ireport.test.com\images\demo.jpg)但是当在Spring生成HTML预览时图片不显示,调试一看程序总是去找 IReport编译过的 img_0_0_1
解决方法:将上图的Is Lazy勾选上,如下图:
这时要注意的是,当再Preview的时候,参数logoUrl必须用网络路径(如:http:\\ireport.test.com\images\demo.jpg)
1.在生成pdf时全空白
问题描述:在DEMO中生成html与pdf一切正常,但放入生产环境就出这个问题,demo与生产环境的唯一不同就是生 产环境使用的是流输出
解决方法:修改报表的属性,将When No Date 选项改为All sections, No Detial(如果detial用数据,就不会出现这种情况)
2.JavaBean数据不能绑定
问题描述:与一的情况一样,也是由于流方式数据绑定方式的问题
解决方法:
复制代码
要单独绑定jrDataSource,不能做为parameters传递
问题描述:在DEMO中生成html与pdf一切正常,但放入生产环境就出这个问题,demo与生产环境的唯一不同就是生 产环境使用的是流输出
解决方法:修改报表的属性,将When No Date 选项改为All sections, No Detial(如果detial用数据,就不会出现这种情况)
2.JavaBean数据不能绑定
问题描述:与一的情况一样,也是由于流方式数据绑定方式的问题
解决方法:
复制代码
1
2
|
JRDataSource jrDataSource =
new
JRBeanCollectionDataSource(beanData);
byte
[] pdfStream = JasperRunManager.runReportToPdf(fileInputStream, parameters, jrDataSource);
|
描述:在生成PDF时,如果对打开PDF后默认样式进设更改(如:缩放比例、是否显示缩略图等)
有两种方案:
第一种:采用JS(前面也提到过),推荐理由:比较简单,如下:
复制代码
第二种:用IText工具包
复制代码
完整小例:
复制代码
更多设置详见PdfWriter文档,如:PdfWriter.PageModeUseThumbs打开显示缩略图等
参考文档:
http://api.itextpdf.com/itext/com/itextpdf/text/pdf/class-use/PdfName.html
http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfDestination.html
http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfWriter.html
实列参考:
http://java360.blogspot.jp/2012/07/itext.html
有两种方案:
第一种:采用JS(前面也提到过),推荐理由:比较简单,如下:
复制代码
1
|
script.append(
"\r\nthis.zoom=125"
);
//缩放125%显示文档
|
第二种:用IText工具包
复制代码
1
2
3
4
5
|
//设置PDF缩放比例
PdfWriter writer = stamp.getWriter();
PdfAction ac = PdfAction.gotoLocalPage(
1
,
new
PdfDestination(PdfDestination.XYZ, -
1
, -
1
,
1
.25f), writer);
//缩放125%显示文档
writer.setOpenAction(ac);
|
完整小例:
复制代码
1
2
3
4
5
6
|
PdfReader pdf =
new
PdfReader(
"abc.pdf"
);
PdfStamper stp =
new
PdfStamper(pdf,
new
FileOutputStream(
"abcout.pdf"
));
PdfWriter writer = stp.getWriter();
PdfAction ac = PdfAction.gotoLocalPage(
1
,
new
PdfDestination(PdfDestination.XYZ, -
1
, -
1
,
0
.1f), writer);
writer.setOpenAction(ac);
stp.close();
|
参考文档:
http://api.itextpdf.com/itext/com/itextpdf/text/pdf/class-use/PdfName.html
http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfDestination.html
http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfWriter.html
实列参考:
http://java360.blogspot.jp/2012/07/itext.html
spring mvc + jasperreports + ireport如何对输出的二进制文件进行缩放设置
问题描述:这个与导出PDF文件不同,不能用导出的方式来设置缩放比例,如图:
未设置前:
自动缩放:
设置后:
缩放125%
如果想让页面打开后按自已想要的缩放比例进行显示则在请求URL后加上如下对数:
复制代码
page:页码,要进行缩放的页码
zoom:缩放比例(125),左上解的坐标(0,612)
如何快速获取以上参数:
在URL请求不加参数状态下点击“当前视图(得制或在新窗口打开)”,如图:
之后,就会在请求URL后自动加上以上参数,然后根据需要进行值的修改。
未设置前:
自动缩放:
设置后:
缩放125%
如果想让页面打开后按自已想要的缩放比例进行显示则在请求URL后加上如下对数:
复制代码
1
|
#page=1,2,3&zoom=125,0,612
|
zoom:缩放比例(125),左上解的坐标(0,612)
如何快速获取以上参数:
在URL请求不加参数状态下点击“当前视图(得制或在新窗口打开)”,如图:
之后,就会在请求URL后自动加上以上参数,然后根据需要进行值的修改。
jasperreports+ireport web打印解决方案
web client 打印通常有以下几种方式:
1.第三方控件
使用简单,但是都是收费(部分功能免费)而且是非开源的,对于日常用的话Lodop打印控件就够用了,且是非完全免费中最好的(功能限制是最少的)
2.利用PDF打印(推荐)
使用也同样比较简单,直接输入pdf文件,然后利用pdf的打印功能,但我们的需求一般都是自动打印,而不是局限于先预览再打印,如何解决这一问题: 在 jasperreports的 answers中找到这样一个问题 how to add silent printing ireport PDF?其中提到了 itext,在 jasperreports中也有此包:iText-2.1.7.js2.jar(这里可能重新打包了,官方最新包为itextpdf-5.4.4.jar)
复制代码
这里借助iText和 Adobe Acrobat的 Javascript支持,可以实现PDF文档的自动打印,其中 Silent printing也说明了pdf的自动打印方式:
复制代码
主要就是在pdf中加入这句JS代码,其中各参数意义在AcroJSGuide(文档)或
Acrobat JavaScript Scripting Reference(API)中的 Printing PDF Documents/Document Object->Documents Methods-> print
完整代码:
复制代码
这里会遇到中文字体问题请参见:http://bbs.apiusage.com/read/248
扩展阅坊:AcroJSGuide(文档) AcroJSGuide.pdf
Acrobat JavaScript Scripting Reference(API) AcroJSGuide.pdf
Digital Signatures for PDF documentsdigitalsignatures20130304.pdf
itext api
itext 所有包下载地址
其中Digital Signatures for PDF documents中有许多实列代码可供参考
3.利用flash打印
官方只是有显示例子,但去掉了打印功能
5.applet打印(只针对JAVA程序)
官方DEMO怎么也没调出来,预览可以,但打印无反应也不报错 (总之applet有各种各样的问题)
1.第三方控件
使用简单,但是都是收费(部分功能免费)而且是非开源的,对于日常用的话Lodop打印控件就够用了,且是非完全免费中最好的(功能限制是最少的)
2.利用PDF打印(推荐)
使用也同样比较简单,直接输入pdf文件,然后利用pdf的打印功能,但我们的需求一般都是自动打印,而不是局限于先预览再打印,如何解决这一问题: 在 jasperreports的 answers中找到这样一个问题 how to add silent printing ireport PDF?其中提到了 itext,在 jasperreports中也有此包:iText-2.1.7.js2.jar(这里可能重新打包了,官方最新包为itextpdf-5.4.4.jar)
复制代码
1
2
3
4
5
6
7
8
|
PdfWriter writer = PdfWriter.getInstance(document, baos);
writer.setViewerPreferences( PdfWriter.HideMenubar | PdfWriter.HideToolbar | PdfWriter.HideWindowUI );
document.open();
writer.addJavaScript(
"this.print({bUI: false,bSilent: false,bShrinkToFit: true});"
+
"\r\n"
+
"this.closeDoc();"
|
这里借助iText和 Adobe Acrobat的 Javascript支持,可以实现PDF文档的自动打印,其中 Silent printing也说明了pdf的自动打印方式:
复制代码
1
|
this
.print({bUI:
false
, bSilent:
true
, bShrinkToFit:
true
});
|
完整代码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
@RequestMapping
(value =
"/printed"
)
public
void
printed(HttpServletRequest request, HttpServletResponse response)
throws
IOException, ServletException, DocumentException{
ServletContext context = request.getSession().getServletContext();
try
{
//获得模板
String reportFileName = context.getRealPath(
"/WEB-INF/reports/demo-report.jasper"
);
File reportFile =
new
File(reportFileName);
if
(!reportFile.exists())
throw
new
JRRuntimeException(
"文件 demo-report.jasper不能找到."
);
//设置模板中需要的参数
Map<String, Object> parameters =
new
HashMap<String, Object>();
parameters.put(
"parameters1"
,
"K12013102900001"
);
parameters.put(
"parameters2"
,
"中文"
);
parameters.put(
"logoUrl"
, context.getRealPath(
"/WEB-INF/reports/demo.jpg"
));
//读取模板文件
FileInputStream fileInputStream =
new
FileInputStream(reportFile);
//将模板转成PDF
byte
[] pdfStream = JasperRunManager.runReportToPdf(fileInputStream, parameters);
//输出流
PdfReader reader =
new
PdfReader(pdfStream);
ByteArrayOutputStream bos =
new
ByteArrayOutputStream(pdfStream.length);
try
{
//给pdf加上脚本实现自动打印
StringBuffer script =
new
StringBuffer();
script.append(
"this.print({bUI:false,bSilent:true,bShrinkToFit:false});"
);
PdfStamper stamp =
new
PdfStamper(reader, bos);
stamp.setViewerPreferences(PdfWriter.HideMenubar | PdfWriter.HideToolbar | PdfWriter.HideWindowUI);
stamp.addJavaScript(script.toString());
stamp.close();
}
catch
(DocumentException e) {
logger.error(e.getMessage(), e.getCause());
}
//输出pdf
byte
[] bytes = bos.toByteArray();
if
(bytes !=
null
&& bytes.length >
0
){
response.setContentType(
"application/pdf"
);
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
try
{
ouputStream.write(bytes,
0
, bytes.length);
ouputStream.flush();
}
finally
{
if
(ouputStream !=
null
){
try
{
ouputStream.close();
}
catch
(IOException ex)
{
}
}
}
}
}
catch
(JRException e)
{
e.printStackTrace();
}
}
|
这里会遇到中文字体问题请参见:http://bbs.apiusage.com/read/248
扩展阅坊:AcroJSGuide(文档) AcroJSGuide.pdf
Acrobat JavaScript Scripting Reference(API) AcroJSGuide.pdf
Digital Signatures for PDF documentsdigitalsignatures20130304.pdf
itext api
itext 所有包下载地址
其中Digital Signatures for PDF documents中有许多实列代码可供参考
3.利用flash打印
官方只是有显示例子,但去掉了打印功能
5.applet打印(只针对JAVA程序)
官方DEMO怎么也没调出来,预览可以,但打印无反应也不报错 (总之applet有各种各样的问题)
【续】 jasperreports+ireport web打印解决方案
前续文章:1. jasperreports+ireport web打印解决方案
2. spring mvc + jasperreports + ireport如何对导出PDF进行默认显示设置(setting zoom size Itext)
3. spring mvc + jasperreports + ireport如何对输出的二进制文件进行缩放设置
问题描述:
上面三篇都提到与打印有关的事项,但一直都是用虚拟打印机测试,未真正实际打印输出过,就在真正用打印机输出时,问题出来了,chrome、 firefox打出来的不清晰,但chrome要比firefox好很多,如果要求不高的话那样就可以了(我这里用的是“复写纸”),如果是激光打印机的 话,打印出来的效果完全可以了
问题原因:
firefox:本身内置 PDF 查看器,采用的是PDF.JS,对中、日、韩编码支持不好
chrome:本身也内置 PDF 查看器“Chrome PDF Viewer”
如果是在线浏览PDF文件,不需要再安装什么PDF阅读器了,但我本身就安装了Adobe Reader(这就使得浏览器有了相应的PDF插件)、 Adobe Acrobat,即使这样,浏览器也是默认使用自已的PDF 查看器
既然找到了问题,那就是如何解决问题了:
firefox:
修改默认PDF查看器:
参见: http://support.mozilla.org/zh-CN/kb/disable-built-pdf-viewer-and-use-another-viewer
- 点击 Firefox 窗口顶部的 Firefox 按钮并选择 选项。
- 选择 应用程序 面板。
- 在列表中找到便携式文档格式 (PDF)并单击以选中它。
- 点击该项右侧的动作列的下拉箭头,然后选择您想使用的 PDF 查看器。
5.点击 确定 按钮关闭“选项”窗口
注意:之前因我安装了Adboe Acrobat破解版导致这个插件怎么都无法更新,卸载后重装或不装
chrome:
1.在地址栏中输入 chrome:plugins
2.找到 Chrome PDF Viewer,点停用
至此再打印,就完全用我们所选用的PDF阅读器打印了,完全清晰可见。
注:有些JS,如缩放不起作用,也是由于浏览器自带的PDF阅读器的问题,但也不是所有的JS用了我们自已安装的PDF查看器就能执行,如 this.closeDoc() 在 web中查看PDF文档肯写也不会有作用的
jasperreports+irepor 生成pdf不能输出中文问题
问题描述:在用jasperreports+irepor 生成pdf时,所有显示中文的地方都是空白解决方法:
在制作报表模板时无论是参数、字段还是静态文本都有以下三个属性:
Pdf font name : STSong-Light //简体宋体
Pdf Embedded : 勾选
Pdf Encoding : UniGB-UCS2-H (Chinese Simplified)
按以上红色字体进行设置即可,但这里还需要一个包 iTextAsian.jar