helongno1
2012-05-17 17:47
浏览 1.3k
已采纳

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

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • liulijun_cn_2011 2012-05-18 13:45
    已采纳

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

    点赞 打赏 评论
  • liulijun_cn_2011 2012-05-18 09:48

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

    点赞 打赏 评论

相关推荐 更多相似问题