问题描述:项目中到jasper+iReport导出报表,由于业务需求,我们将一个PDF文件中,用多个iReport画好的japser模版拼起来,然后一起导出成一个文件,可这样的话分页就出现了问题,一个pdf相对于多个jasper 页码就会出现“1,2,1,2”这样的情况,而实际上是想要“1,2,3,4”这样的页码,请问各位谁遇到过这样的问题,或者提供一个解决问题的思路
ps:google,baidu 了一圈儿了,没有找到办法,至于业务上是不可能改变的了,就是用拼接报表的形式,我开始也想把他们合成为一个jasper文件,但由于各种原因,不能动,所以就造成了现在这样的局面,所有积分都给了。项目很紧,望大家帮助,小弟在此谢过了。
1.jasperreport的API,将jasper模板传入,DataSource传入。
返回一个byte[]。
2.PdfConbineUtils.add(xxxx);加入前面返回的Byte数组。可以为N个。
3.PdfConbineUtils.conbine();返回总的byte[]
4.调用jasperAPI。传入byte[]。直接输出PDF。
[code="java"]
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();
}
}
[/code]
如果我没记错的话这个可以达到你的要求。
conbine()竖列形式,conbineSide()横列形式。其他的我相信你能看懂。
如果多人同时出PDF时,数据混乱,用线程同步一下即可。
日语注释看不到你就直接删掉吧。这是我们以前项目用的。