0 0

jasper 把多个jasper文件合并成一个pdf导出时的分页问题30

问题描述:项目中到jasper+iReport导出报表,由于业务需求,我们将一个PDF文件中,用多个iReport画好的japser模版拼起来,然后一起导出成一个文件,可这样的话分页就出现了问题,一个pdf相对于多个jasper 页码就会出现“1,2,1,2”这样的情况,而实际上是想要“1,2,3,4”这样的页码,请问各位谁遇到过这样的问题,或者提供一个解决问题的思路


ps:google,baidu 了一圈儿了,没有找到办法,至于业务上是不可能改变的了,就是用拼接报表的形式,我开始也想把他们合成为一个jasper文件,但由于各种原因,不能动,所以就造成了现在这样的局面,所有积分都给了。项目很紧,望大家帮助,小弟在此谢过了。

问题补充:liulijun 你好,谢谢你的回答,但我还是有几个问题,首先代码我能看懂,不包括日文,但我不懂应该怎么用这段程序,也就是说我是用jasper导出的,我的代码片段如下:
try {
File reportFile = new File(ServletActionContext.getServletContext().getRealPath("/model1/jsp/opinionReport/outReportPDF/" + reportName + ".pdf"));
OutputStream ouputStream = new FileOutputStream(reportFile);
//使用JRPdfExproter导出器导出pdf
        JRPdfExporter exporter = new JRPdfExporter();
        //设置JasperPrintList
        exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList); 
        exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream); 
        exporter.exportReport();
        ouputStream.close();
        return true;
}catch(Exception ex){
ex.printStackTrace();
}
请问如何调整或者调用你写的这段程序呢? 初看你程序我认为你是用iText导出的,也许是小弟学疏才浅没看懂,望高人指导。
2012年5月17日 17:47

2个答案 按时间排序 按投票排序

0 0

采纳的答案

1.jasperreport的API,将jasper模板传入,DataSource传入。
返回一个byte[]。
2.PdfConbineUtils.add(xxxx);加入前面返回的Byte数组。可以为N个。
3.PdfConbineUtils.conbine();返回总的byte[]
4.调用jasperAPI。传入byte[]。直接输出PDF。

2012年5月18日 13:45
0 0

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.PageSize;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;

public class PdfConbineUtils {
	/** 当クラス */
	private static final Class THIS_CLASS = PdfConbineUtils.class;
	
	private Collection byteColl = new ArrayList();
	
	public byte[] conbine() 
		throws IOException, DocumentException{
		String methodName = "conbine";
		BaseLoggerUtils.logStart(THIS_CLASS, methodName);
		ByteArrayOutputStream conbined = new ByteArrayOutputStream();
		Document document = new Document(PageSize.A4);
		
		PdfWriter pdfwriter = PdfWriter.getInstance(document, conbined);
		
		document.open();
		
		PdfContentByte pcb = pdfwriter.getDirectContent();
		
		PdfReader reader = null;
		PdfImportedPage page = null;
		
		Iterator ite = byteColl.iterator();
		while (ite.hasNext()) {
			//テンプレートの内容を取得
			reader = new PdfReader((byte[])ite.next());
			
			for (int i=0;i<reader.getNumberOfPages();i++) {
				document.newPage();
				page = pdfwriter.getImportedPage(reader,i+1);
				//テンプレート追加
				pcb.addTemplate(page, 0, 0);
			}
		}
		
		document.close();
		
		BaseLoggerUtils.logEnd(THIS_CLASS, methodName);
		return conbined.toByteArray();
	}

	public byte[] conbineSide() 
		throws IOException, DocumentException{
		String methodName = "conbineSide";
		BaseLoggerUtils.logStart(THIS_CLASS, methodName);
		ByteArrayOutputStream conbined = new ByteArrayOutputStream();
		//横書き設定
		Document document = new Document(PageSize.A4.rotate());	
		PdfWriter pdfwriter = PdfWriter.getInstance(document, conbined);
		
		document.open();
		
		PdfContentByte pcb = pdfwriter.getDirectContent();
		
		PdfReader reader = null;
		PdfImportedPage page = null;
		
		Iterator ite = byteColl.iterator();
		while (ite.hasNext()) {
			//テンプレートの内容を取得
			reader = new PdfReader((byte[])ite.next());
			
			for (int i=0;i<reader.getNumberOfPages();i++) {
				document.newPage();
				page = pdfwriter.getImportedPage(reader,i+1);
				//テンプレート追加
				pcb.addTemplate(page, 0, 0);
			}
		}
		
		document.close();
		
		BaseLoggerUtils.logEnd(THIS_CLASS, methodName);
		return conbined.toByteArray();
	}
	/**
	 * 
	 * 帳票を追加する。<br>
	 * @param byteArray
	 */
	public void add(byte[] byteArray) {
		byteColl.add(byteArray);
	}
	
	/**
	 * 
	 * 設定されている帳票内容を削除する。<br>
	 *
	 */
	public void clear() {
		byteColl.clear();
	}
}



如果我没记错的话这个可以达到你的要求。
conbine()竖列形式,conbineSide()横列形式。其他的我相信你能看懂。
如果多人同时出PDF时,数据混乱,用线程同步一下即可。
日语注释看不到你就直接删掉吧。这是我们以前项目用的。

2012年5月18日 09:48

相关推荐

    jasper6.0pdf 导出中文不显示(乱码)问题.doc

    在使用JasperReports 6.0版本开发报告并导出为PDF格式时,有时会遇到中文不显示或者显示为乱码的问题。这个问题主要是由于字符编码设置不正确以及缺少支持中文的字体库导致的。以下是一份详细的解决方案: 1. **...

    jasper+ireport+jfreechart导出html.excel.word.pdf

    总的来说,"jasper+ireport+jfreechart导出html.excel.word.pdf"这个主题涵盖了报表设计、数据绑定、图表生成以及多种格式导出的关键技术。通过学习和应用这些工具,开发者可以构建出高效、直观的数据呈现系统,满足...

    jasper简单粗暴解决中文导出pdf

    在处理中文字符时,由于Jasper默认使用的iText库对中文支持不够完善,导致在导出PDF时可能会出现乱码或无法显示的问题。针对这一问题,我们可以采取一种简单而直接的方法来解决。 标题中的“jasper简单粗暴解决中文...

    JasperReport浏览器输出PDF为空白页的解决方案

    如果XML语法有误,或者数据绑定不正确,可能导致生成的`test.jasper`预编译报告文件无效,从而在导出PDF时显示为空白。 2. **数据源问题**:报表需要数据来填充,如果数据源未正确设置或数据提供者(例如JavaBean、...

    使用jasperreports制作报表(导出pdf excel html)

    2. **编译JRXML文件**:使用`JasperCompileManager.compileReport()`方法将JRXML文件编译成`.jasper`预编译文件。 3. **填充数据**:使用`JasperFillManager.fillReport()`方法,传入`.jasper`文件和数据源来填充...

    jasperreports分页例子

    在PDF导出中,分页功能尤为重要,因为PDF文件通常需要明确的页面布局。JasperReports确保在导出过程中正确地维护分页设置。 8. **实际应用示例** 通过这个"jasperreports分页例子",初学者可以了解如何在实践中...

    Jasperreport导出PDF

    在Java代码中,我们将使用JasperReport API来加载`.jrxml`文件,编译成`.jasper`格式,然后填充数据并导出为PDF。以下是一个基本的示例: ```java import net.sf.jasperreports.engine.*; import java.io.File; ...

    基于Jasperreport动态单元格合并模板

    3. **动态合并策略**:在处理多分组时,可能需要根据分组的数量动态合并单元格。这通常通过自定义Scriptlet实现,Scriptlet是一个Java类,其中的方法在报表生成过程中被调用。例如,可以在`groupFooter`事件中计算...

    jasperreport列合并

    列合并是报表设计中的一个重要特性,尤其是在创建多列布局或需要对某些内容进行汇总时。 要实现JasperReport的列合并,我们主要需要关注以下几点: 1. **报表设计**:在iReport或Jaspersoft Studio这样的可视化...

    jasperReport 动态合并单元格示例

    然后,使用JasperFillManager填充数据并用JasperExportManager导出报表,如PDF、Excel等格式,以查看动态合并的效果。 总的来说,jasperReport的动态合并单元格功能提供了一种灵活的方式来调整报告的布局,使得报告...

    jasper 的 jar 文件

    在实际使用jasper的jar文件时,开发者通常会经历以下步骤: 1. **报表设计**:使用iReport或Jaspersoft Studio创建.jrxml文件,定义报表结构和样式。 2. **编译报表**:将.jrxml文件编译成.jasper二进制文件,这个...

    JasperServer中文版

    这个资源包包含了JasperServer界面的中文语言翻译,使得中国用户在使用时能够更加便捷地理解和操作。 JasperServer是用于创建、部署和管理报表、仪表板以及数据分析应用的服务器平台。它支持多种数据源,包括关系型...

    jasperreport6 导出pdf中文不显示问题解决方式

    本文档描述了如何解决导出pdf文件中文不显示问题。jasperreport6版本以上已经对pdf font name、pdf encoding等配置弃用,而改为使用font配置字体,所以以前使用itext jar包的方式已经不能解决pdf中文不显示问题,...

    jasperReports根据Jaspersoft Studio导出报表通用工具类/附pdf无法导出中文解决方法

    jasperReports-6.5.1使用Jaspersoft Studio生成的jasper模板导出pdf,docx,ppt,xls,xlsx; 包括多模板导出pdf,docx,ppt; 基于java web项目,response导出,补充了pdf无法导出中文解决方法.

    jasper模版文件+工程demo

    3. **编译模板**:将`.jrxml`文件转换为`.jasper`文件,这个过程将模板的逻辑编译成Java字节码,以便于运行时快速解析。 4. **填充数据**:在Java应用程序中,使用`JasperFillManager`加载`.jasper`文件,并传递数据...

    jasperReports根据Jaspersoft Studio导出报表通用工具类

    jasperReports-6.5.1使用Jaspersoft Studio生成的jasper模板导出pdf,docx,ppt,xls,xlsx; 包括多模板导出pdf,docx,ppt; 基于java web项目,response导出,有问题可以给我留言.

    jasper的一个小例子

    这个"jasper的一个小例子"可能会涵盖上述的一些基础知识,例如创建一个简单的报表模板,连接到数据库并填充数据,最后导出为PDF文件。如果你正在学习JasperReports,理解这些基本概念将有助于你快速上手并解决实际...

    教你怎么利用ireport软件制作jasper报表文件,是报表模版软件

    【ireport软件制作jasper报表文件教程】 ireport是一款用于设计jasper报表的开源工具,它为Java开发者提供了直观的图形界面,使得创建复杂的报表变得简单易行。jasper报表文件通常以jrxml格式存储,它是基于XML的,...

    japser实现批量打印

    也可以选择先将所有报表合并成一个PDF,再一次性打印。 5. **错误处理**:在批量处理过程中,可能会遇到各种问题,如数据源问题、打印机错误等。因此,必须编写适当的错误处理代码,确保即使部分报表失败,其他报表...

    ireport导出报表.pdf

    iReport报表设计过程中,首先需要一个jasper文件(.jrxml),这是一个XML格式的报表设计模板。在这个模板中,可以定义报表的布局、样式以及动态内容,如文本字段、图片、图表等。 2. JasperPrint对象: 在报表生成...

Global site tag (gtag.js) - Google Analytics