解决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 套打 的相关文章

  • onclick 函数上的 CSS 选择器

    有没有办法让CSS选择器onclick function 您可以在onclick https stackoverflow com questions 24365416 select element which have specific a
  • 如何将 div (或任何元素)覆盖在表格行 (tr) 上?

    我想在恰好有多个列的表行 tr 标记 上覆盖一个 div 或任何可以使用的元素 我尝试了几种方法 似乎都不起作用 我在下面发布了我当前的代码 我确实得到了一个覆盖 但不是直接覆盖在该行上 我尝试将覆盖顶部设置为 div Bottom css
  • 如何在react-select v2中创建optgroup?

    我想在我的反应选择列表中包含 optgroups 但它似乎没有记录在任何地方 我有以下结构 是从评论中提取的https github com JedWatson react select issues 59 https github com
  • 优化数据可视化 Web 应用程序的性能

    我正在重写 3 年前编写的数据可视化网络工具 从那时起 浏览器的 JavaScript 引擎变得更快 所以我正在考虑将部分工作从服务器转移到客户端 在页面上 数据在表格和地图 或图表 中可视化 它使用相同的数据 但以不同的方式 因此准备显示
  • 1分30秒倒计时器javascript

    我有代码 但它适用于 2 分钟计时器 我需要将其修改为 1 分 30 秒计时器 我已经尝试过 但未能从 1 30 开始计时器 因为我是这一行的初学者 并且想学习如何做到这一点 这是代码 div div
  • 在 Angular 单元测试中应该如何处理运行块?

    我的理解是 当您在 Angular 单元测试中加载模块时 run块被调用 我认为如果你正在测试一个组件 你不会想同时测试run块 因为unit测试应该只是测试一个unit 真的吗 如果是的话有什么办法可以防止run阻止运行 我的研究让我认为
  • jQuery - 提高处理 XML 时的选择器性能

    我正在处理一个 XML 文件 当使用 XPath 样式选择器选择节点时 该文件的性能非常慢 这是运行特别慢的部分代码 for i 0 i
  • NodeJs读取JSON文件

    我正在使用 NodeJs 读取 json 文件 我的代码非常基本 var obj require sample json console log obj 0 Sample json 文件包含这样的字符串化 JSON sample good
  • 是否可以将自定义 HTML 添加到传单图层组和图层控件

    有什么方法可以将自定义 HTML 注入图层组和图层控件中吗 在我们的应用程序中 我们实现了滑块 输入 范围 来调整不透明度设置 并且很明显 在其控制容器内部的基础层上使用专用滑块是有意义的 没有选项或参数可以修改此控件 理想情况下 我们希望
  • Webpack 和 Angular HTML 图像加载

    我一直对 webpack 和 Angular 感到头疼 这可能有一个简单的答案 但我无法弄清楚 我已经阅读了堆栈溢出中关于这个主题的几乎所有答案 但都无济于事 我有一个像这样的 html 页面 还有其他包含图像的模板 img
  • Twitter Bootstrap 轮播在加载时自动播放

    使用twitter bootstrap框架 如何调用轮播来 自动滑动 这意味着当页面加载时 轮播会自动滚动 我尝试过 javascript onLoad click 函数 a 下一个链接的 但这不起作用 你应该这样做Twitter Boot
  • Disqus 评论数始终为 0 条评论

    我想我已经按照通用代码的说明设置了 Disqus 问题是它总是说某个帖子有 0 条评论 拿这个帖子来说 http tx0rx0 com retropie and the raspberry pi http tx0rx0 com retrop
  • SVG 中三角形的圆角

    我正在尝试制作一个具有圆角的三角形 三角形将如下所示 左下角是唯一看起来相当容易制作的角 主要是因为这是一个 90 度的 转弯 该转弯是使用QSVG 中的命令具有以下参数 Q x y height x y height RADIUS从我正在
  • FormData 中的 Blob 为 null

    我正在尝试通过远程 API 通过 ajax 在 android 中发送创建的照片 我在用着相机图片背景 https github com an rahulpandey cordova plugin camerapicturebackgrou
  • 将数组中的所有元素相乘

    我在这里找不到我真正想要的例子 我想将所有数组元素相乘 因此如果数组包含 1 2 3 总和将为 123 6 到目前为止 我已经得到了这段代码 但它返回未定义 function multiply array var sum 1 for var
  • D3.js - 具有多个环的圆环图

    以下示例显示了 D3 js 中的圆环图 是否可以向图表添加多个圆环 var dataset apples 53245 28479 19697 24037 40245 var width 460 height 300 radius Math
  • 在 Firefox 中使用 Javascript 检测键盘布局

    有没有办法在 Firefox 中检测客户端的键盘布局 我知道 Chrome 的答案是肯定的 请参阅https developer mozilla org en US docs Web API Navigator keyboard https
  • 使用 div 或表格来包含链接列更好吗?

    我的页面底部有 3 列链接 每列都放入一个 div 中 所有三个 div 都包装在页面中央的一个大 div 中 这是更适合桌子的东西还是桌子不适合这项工作 您还可以使用 ul http www w3schools com tags tag
  • 将 Angular Web 组件 EventEmitter 监听到 javascript

    我在以下工具的帮助下创建了一个小型网络组件本文 https medium com IMM9O web components with angular d0205c9db08f使用角度元素 其中包括 Input and Output 我能够将
  • R闪亮:使用闪亮的JS从数据表中获取信息

    我想读出所有列名称以及它们在数据表中显示的顺序 由于不同的原因 我无法使用 stateSave 等选项 我对 JS 没有什么把握 但我确信用它可以完成 所以我需要你帮助我 我尝试过类似的代码片段 datatable data callbac

随机推荐

  • 利用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中的打印 套打是经常被提到的 这个需求