解决Jasperreport的web 套打

2023-11-10

前段时间写了一篇 解决Jasperreport的web打印另一种方法http://www.blogjava.net/three-3/archive/2010/06/24/324329.html
关于在web中的打印 套打是经常被提到的,这个需求很广泛,中间忙了一些其他的事情,到今天才把在Jasperreport实现web套打的内容整理好。

在读这篇文章之前最好先读一下上一篇文章,里面有些设计到jatoolsprinter的内容需要了解一下。

        下面开始讲述一下整个套打的过程

1:首先用ireport制作一张套打的报表如下图


 

如下模板所示 在一个image组件上放上要打印的内容,我这里的演示是从数据库中取到的字段打印出来。



 

至于ireport模板的制作,我这里不做介绍,因为我自己也没有接触多久,会的不一定比你多。

 

2:创建JSP文件 代码如下

<% @ page language = " java " contentType = " text/html; charset=utf-8 "
    pageEncoding
= " utf-8 " %>
<% @ page import = " net.sf.jasperreports.engine.* " %>
<% @ page import = " java.util.* " %>
<% @ page import = " java.io.* " %>
<% @ page import = " java.sql.* " %>
<% @ page import = " net.sf.jasperreports.engine.util.* " %>
<% @ page import = " net.sf.jasperreports.engine.export.* " %>

< html >
   
< head >
       
<!-- 插入打印控件 -->
       
< OBJECT ID = " jatoolsPrinter "
            CLASSID
= " CLSID:B43D3361-D975-4BE2-87FE-057188254255 "
            codebase
= " jatoolsPrinter.cab#version=5,3,0,0 " ></ OBJECT >
   
</ head >
   
< script type = " text/javascript " >
function doPrint(how)
               
{
               
//打印文档对象
                var myDoc =
                   
{
                    settings:
                       
{
                        pageWidth:
2100,    //自定义纸张宽度(单位为十分之一毫米)
                        pageHeight: 1400 //自定义纸张高度(单位为十分之一毫米)
                        orientation: 1//打印方向
                        }
,
                    enableScreenOnlyClass:
true, // 使所有使用 screen-only 样式类的对象,只在预览、显示时可见,打印时隐藏
                    documents: document, // 打印页面(div)们在本文档中
                    marginIgnored: true,
                   settingsID:
'mydocc', //打印设置的ID保存在注册表中
                    copyrights: '杰创软件拥有版权   www.jatools.com'// 版权声明必须
                    }
;
   
// 调用打印方法
if(how =='打印预览')
        jatoolsPrinter.printPreview(myDoc,
true );   // 打印预览
                
      
elseif(how =='打印')
           jatoolsPrinter.print(myDoc ,
true);   // 打印前弹出打印设置对话框
               
      
else
           jatoolsPrinter.print(myDoc ,
false);       // 不弹出对话框打印
}

</ script >
   
< body bgcolor = " white " >

       
< br >
       
< input type = " button " value = " 打印预览 " onClick = " doPrint('打印预览') " >
       
< input type = " button " value = " 打印 " onClick = " doPrint('打印') " >
       
< input type = " button " value = " 打印 " onClick = " doPrint('打印') " >
       
< br >




       
<%
                    File reportFile
= new File(application
                    .getRealPath(
" /jasper/taoda.jasper " ));
            JasperReport jasperReport
= (JasperReport) JRLoader
                    .loadObject(reportFile.getPath());
            Map parameters
= new HashMap();

            Class.forName(
" com.mysql.jdbc.Driver " );
            Connection conn
= DriverManager.getConnection(
                   
" jdbc:mysql://localhost:3306/DataName " , " user " , " password " );
            JasperPrint jasperPrint
= JasperFillManager.fillReport(
                    jasperReport, parameters, conn);

            JRXhtmlExporter exporter
= new JRXhtmlExporter();
            StringBuffer sbuffer
= new StringBuffer();

            Map imagesMap
= new HashMap();
            session.setAttribute(
" IMAGES_MAP " , imagesMap);

            exporter
                    .setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
            exporter
                    .setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap);
            String imgServDirUrl
= " /images/ " ;
            File imgRealDir
= new File(request.getRealPath(File.separator)
                   
+ imgServDirUrl);
           
if ( ! imgRealDir.exists()) {
                imgRealDir.mkdirs();
            }

            exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, request
                    .getContextPath()
                   
+ imgServDirUrl);
            exporter.setParameter(JRHtmlExporterParameter.IMAGES_DIR,
                    imgRealDir);
            exporter.setParameter(
                    JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR,
                    Boolean.TRUE);

            exporter.setParameter(
                    JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,
                    Boolean.FALSE);
            exporter.exportReport();
            conn.close();
       
%>


其中以下内容为jatoolsprinter所需代码

< OBJECT ID = " jatoolsPrinter "
            CLASSID
= " CLSID:B43D3361-D975-4BE2-87FE-057188254255 "
            codebase
= " jatoolsPrinter.cab#version=5,3,0,0 " ></ OBJECT >



function doPrint(how)
               
{
               
//打印文档对象
                var myDoc =
                   
{
                    settings:
                       
{
                        pageWidth:
2100,    //自定义纸张宽度(单位为十分之一毫米)
                        pageHeight: 1400 //自定义纸张高度(单位为十分之一毫米)
                        orientation: 1//打印方向
                        }
,
                    enableScreenOnlyClass:
true, // 使所有使用 screen-only 样式类的对象,只在预览、显示时可见,打印时隐藏
                    documents: document, // 打印页面(div)们在本文档中
                    marginIgnored: true,
                   settingsID:
'mydocc', //打印设置的ID保存在注册表中
                    copyrights: '杰创软件拥有版权   www.jatools.com'// 版权声明必须
                    }
;
   
// 调用打印方法
if(how =='打印预览')
        jatoolsPrinter.printPreview(myDoc,
true );   // 打印预览
                
      
elseif(how =='打印')
           jatoolsPrinter.print(myDoc ,
true);   // 打印前弹出打印设置对话框
               
      
else
           jatoolsPrinter.print(myDoc ,
false);       // 不弹出对话框打印


 

起先在在jasperreprot中输出格式为html 背景图一直不显示,单独放一张图片,图片上不要有其他组件,就会显示,一直没搞清楚这个问题是什么原因,但是输出格式为xhtml的时候图片就会显示。


 

3:修改JRXhtmlExporter代码


 

根据jatoolsprinter的规范,需要在打印的内容的div 命名规则必须为<div id='page'+数字>

Jasperreport是利用<a name="JR_PAGE_ANCHOR_?_?"></a>来区分页数所以我们在代码中找到输出JR_PAGE_ANCHOR_?_? 的位置在他之后加上

writer.write("<div id='page"+ (pageIndex + 1)+"'>"n");

exportPage(page);

writer.write("</div>"n");


 

4:预览可见,打印不可见。

这样打印的页面jatoolsprinter就可以找到了。可是还有个问题,套打一般的问题都是希望那个底图在预览的时候可见而打印的时候不打印,那么这个问题在jatoolsprinter中是这样处理的。

找到输出img信息的位置如下图



 

在输出img 的信息中添加writer.write(" class=\"screen-only\"");现在底图就不会被打印出来了。

5:启动tomcatweb下运行



 

点击打印预览




最后打印效果如下




 

这篇文章只是对在JsperReport中进行套打进行了介绍。套打当中还会设计到其他的一些问题可以参照早先录的一个视频一步一步教你做web套打(http://www.56.com/u11/v_NTA2MjcyMDM.html),这个就和JsperReport没有任何关系了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决Jasperreport的web 套打 的相关文章

  • 使用 jQuery / .data() 避免内存泄漏

    我正在使用 jQuery 动态创建 HTML 元素 现在需要针对它们存储 JavaScript 数据 但是 我现在担心内存泄漏 因为我实际上从未在对象上调用 删除 我 append 和 detach 它们 但从不 remove jQuery
  • Webpack 缺少 CommonsChunk 和 extract-text-webpack-plugin 模块

    我正在跟进Maxime Fabre 的 Webpack 教程 https blog madewithlove be post webpack your bags 我正在尝试获得一个非常简单的 webpack 包 其中包含 1 个入口点和 2
  • 为什么“事件”在 Chrome 中全局可用,而在 Firefox 中则不然?

    在回答另一个问题时 出现了一个与event对象在匿名函数中可用 无需传入 在 Chrome 中 下面的代码工作正常 但 Firefox 会抛出错误 document ready function uspsSideboxTrackingClo
  • 有没有办法监控页面上运行的 JavaScript 函数?

    有没有办法查看页面上正在执行哪些功能 如果我在页面上加载外部脚本 是否可以动态更改函数的功能或阻止其运行 HTML5 http www w3 org TR html5 scripting 1 html establish script bl
  • Streamjs和linqjs有什么关系

    读完SICP后 我最近发现streamjs https github com dionyziz stream js 开发商参考linqjs http linqjs codeplex com 作为具有不同语法的替代实现 但我无法建立连接 St
  • 夜间值班。单击带有文本的元素

    我遇到问题 无法单击具有某些独特文本的网页元素 我有这样的结构 div class wg wagon type title Text div 我试试这个 click wg wagon type title contains Text 但我有
  • Typescript:如何在自定义过滤器中使用角度 $filter

    如何在自定义过滤器中使用 Angular filter 如何注入 filter依赖 module Filters export class CustomFilter public static Factory return function
  • 改进 D3 序列旭日示例

    This D3示例作为我的出发点 http bl ocks org kerryrodden 7090426 http bl ocks org kerryrodden 7090426 我想更改提供图表的数据 并且我做了以下新示例 http j
  • 如何在一段特定时间后在后台运行 ajax 调用? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在一段特定的时间后显示警报消息 您想继续吗 如果用户同意 则 ajax 调用必须在后台运行 否则取消 ajax 调用 那么请告诉我
  • 离子旋转器未显示

    我用 http 请求填充 Ionic 集合重复列表 但我不想将所有内容直接加载到 DOM 中 因此 我只显示其中一些项目 并在您向下滚动时添加其余项目 为此我实现了无限滚动功能 当我到达页面底部时 它应该显示一个旋转器 但它没有 这些物品至
  • 更新 Google 地图流量层而无需重新加载页面

    我的页面中嵌入了 Google 地图 我使用 initMap js 函数来初始化地图 function initMap var map new google maps Map document getElementById t map zo
  • 在 php、ajax 或 javascript 中加载进度?

    任何人都知道如何在系统仍在服务器端获取数据的同时在客户端显示加载进度以及完成的百分比 例如 当我在客户端按下 确定 按钮时 它会调用服务器端从数据库收集数据 整个过程可能需要2到3分钟 如何在客户端显示加载进度 大约加载完成了多少 我怎样才
  • 获取url,给定的url重定向到

    我从 rss 链接中挖掘数据并获得一堆网址 例如 http feedproxy google com r electricpig 3 qoF8XbocUbE http feedproxy google com r electricpig 3
  • 如何将当前元素传递给 Knockout.js 绑定中的 Javascript 函数?

    因此 我尝试根据是否选中子复选框 使用 Knockout js 将类添加到元素 为此 我试图通过this作为我的函数的参数 目前 我的精简 DOM 结构如下 tr td td tr
  • Phonegap facebook 插件:android 的各种问题

    我正在尝试将 Phonegap 3 1 与 Phonegap facebook plugin 集成 以使我的应用程序能够使用 facebook 登录 https github com phonegap phonegap facebook p
  • 由于固定导航,增加了 FancyBox v2 的顶部和底部边距

    我目前正在开发一个网站 该网站将来将具有响应能力 该网站主要由图像组成 单击这些图像会加载到 FancyBox 中 FancyBox v2 现在具有响应能力 因此可以在屏幕尺寸发生变化时重新调整图像等的大小 作为我设计的一部分 我有两个固定
  • ReferenceError 和全局对象

    在浏览器中的 JavaScript 中window是全局对象 这意味着在全局范围内定义的每个变量都是window 那么为什么我会得到这个结果 console log window foo No error logs undefined co
  • 父指令属性更改时子指令不会更新

    这是对这两个问题的后续 在父指令和子指令之间传递参数 https stackoverflow com questions 42814530 pass argument between parent and child directives
  • 如何设置 Firebase 用户的显示名称?

    根据Firebase网站上的JS Auth文档 它只展示了如何获取 displayName 以及如何更新 displayName 所以我尝试更新它 但这有点不合逻辑 因为你怎么能在不创建某些东西的情况下更新它呢 所以我的问题是 如何设置注册
  • 使用 JQuery 预填充选择字段的下拉选项验证

    我有这个 JQuery 片段来防止选择已在另一个字段中选择的下拉选项 var coll select name service on change function coll each function var val this value

随机推荐

  • 利用Matlab实现贝叶斯优化卷积神经网络进行数据回归预测

    利用Matlab实现贝叶斯优化卷积神经网络进行数据回归预测 概述 数据回归预测是一项重要的任务 可以通过建立卷积神经网络 Convolutional Neural Network CNN 来实现 然而 在模型参数调优方面存在着挑战 为了解决
  • http请求参数编码问题

    给某api发送http请求 结果查不到数据 而api开发者自测可以查到数据 僵持不下 经过分析发现 我的url是经过urlencode编码的 传出去的中文变成 E5 B2这种 而api开发者的url是明文传输中文 我通过httpclient
  • 构造原生单选或者多选下拉框

    function getRadioList tag pageNum pageSize ajaxHelper ajaxFun type post url data data contentType application json async
  • 急速安装git lfs

    什么是git LFS LFS是large File Storage的缩写 专门用来帮助git管理大型文件 一 curl s https packagecloud io install repositories github git lfs
  • 【问题解决】eclipse ‘Launching Hello'has encountered a problem

    问题 删除eclipse很多项目后 再次运行某一个项目 就会出现错误 eclipse Launching Hello has encountered a problem 解决方案 点此启动此项目 即可 原因 看网上答案 原来点 run 时是
  • 3D 智慧农场可视化——解锁绿色生态田园

    何为 无人农场 中国工程院院士罗锡文用五句话高度概括 耕种管收生产环节全覆盖 机库田间转移作业全自动 自动避障异况停车保安全 作物生产过程实施全监控 智能决策精准作业全无人 随着新一代信息技术飞速融入传统产业 农业数字化 网络化 智能化逐步
  • 聊天室--javaWeb

    文章目录 一 简介 项目说明 实现的主要功能 系统架构 二 项目代码和demo地址 项目代码 项目demo地址 三 具体的功能实现 登录功能 单点登录 聊天功能的实现 踢人功能 简单的分权限 四 补充说明 关于代码 关于项目部署 一 简介
  • 方舟官方服务器怎么显示血量,方舟端游怎么显示血量

    解决方舟如何显示伤害数字 在ARK ShooterGame Saved Config WindowsNoEditor文件夹下的GameUserSetting文件的 ServerSettings 的最后一行中添加命令 ShowFloating
  • array_filter函数的简单使用

    array filter函数 学习笔记 代码 function test odd var 先创建一个方法 方法是调动test odd函数 return var 1 返回条件 取奇数 a1 array a b c 2 3 4 11 23 ec
  • #vue# vue锚点定位,滚动到具体位置

    需求 点击导航栏的各个tab 跳转 滚动 到当前页面的具体位置 步骤 1 首先在导航栏的版块里面加入方法goToAnchor 以及 跳转的id类名 div class nav item center div About div div To
  • 查看.o, .obj文件符号列表,强大的nm命令

    nm命令可以查看 linux以及windows下的 o obj文件中的符号列表 其中 o文件可以由gcc g 编译得到 obj由vc编译得到 太爽了 以后遇到undefined reference错误的时候就可以这个命令搞定了 举一例子 在
  • 【java笔记】常用接口(2):Consumer接口

    Consumer接口是一个消费型接口 泛型指定什么类型 就可以使用accept消费什么类型数据 直接输出 public class Demo public static void main String args method asd na
  • 高德地图弹窗使用vue模板

  • android 遍历assets下的文件

    在AssetManager中有个list 方法 传入你的子文件名称即可 String flLists this getAssets list your subdir 如果是根目录 那么就是这么写 AssetManager assetMana
  • 集合框架的简要介绍

    目录 集合和数组的区别 Collection接口 ArrayList实现类 ArrayList的创建和使用 linkedList Set接口及其实现类 Set接口特点 HashSet实现类 HashSet特点 HashSet避免对象重复的规
  • Service能够创建界面(addView)吗?

    一个Service能够创建界面 addView 吗 一个app 只有Service 没有Activity 能够通过WindowManager调用addView 添加可视界面吗 答案是可以 但是能够创建的界面类型 WindowManager
  • 虚拟化原理介绍

    什么是虚拟化 一台PC机的组成包括 Keyboard 键盘 Monitor 显示器 CPU RAM I O Disk Network 这是基本的五大部件 虚拟化就是在这些基础物理设备上运行多个OS 虚拟化面临的重要问题概述 CPU RAM
  • Android :提取字符串当中的数字

    String a String regEx 0 9 Pattern p Pattern compile regEx Matcher m p matcher fl System out println m replaceAll trim 结果
  • 含测试点归纳

    小编提示 本文含静态测试主要检查点 纯干货 看官们可先收藏后阅读 从是否执行被测试软件来进行分类 测试可以分为静态测试和动态测试 软件本身包含了各种代码 如果只是检查代码和文档 而不执行被测试的软件 此时所进行的就是静态测试 反之 如果在测
  • 解决Jasperreport的web 套打

    前段时间写了一篇 解决Jasperreport的web打印另一种方法http www blogjava net three 3 archive 2010 06 24 324329 html 关于在web中的打印 套打是经常被提到的 这个需求