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

问题描述:项目中到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时,数据混乱,用线程同步一下即可。
日语注释看不到你就直接删掉吧。这是我们以前项目用的。