【问题标题】:pdfbox generate multi pagepdfbox 生成多页
【发布时间】:2013-11-25 10:57:25
【问题描述】:

当我生成第二页时,我得到一个空白页。我有两个功能。一个生成带有文本的表格,另一个生成 PDF。当第一页结束时,我添加另一个页面,我想在新页面中写入。当我打开生成的 PDF 文件时,第二页是空白的:

    //global variables
PDPage nowa=null;
PDPageContentStream contentStream1 = null;

//function to generate table
private void print_sumActionPerformed(java.awt.event.ActionEvent evt){
        try {
            PDDocument doc = null;
            PDPage page = null;
            int max_row=55;
            int suma=0;
            int pozycja=0;
            final int starty=760;
            final int startx=30;
        try{
                doc = new PDDocument();
                page = new PDPage(PDPage.PAGE_SIZE_A4);
                doc.addPage(page);
                PDFont font = PDType1Font.HELVETICA;
                PDPageContentStream content = new PDPageContentStream(doc, page,true,true);
                //some code to generate table
                drawTable(page, content, starty, startx, content1,doc);
                content.close();
                doc.save("path");
                doc.close();
                Thread.sleep(500);
            } catch (Exception e){
                System.out.println(e);
            }
        } catch (IOException ex) {
            Logger.getLogger(Okno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (PrinterException ex) {
            Logger.getLogger(Okno.class.getName()).log(Level.SEVERE, null, ex);
    } 
}                                      

生成pdf表格的函数

private void drawTable(PDPage page, PDPageContentStream contentStream,float y, float margin, String[][] content,PDDocument doc) throws IOException, InterruptedException {
        final int rows = content.length;
        final int cols = content[0].length;
        final float rowHeight = 13f;
        final float marginCell=5;
        final float startx=30;
        final int tableWidth3=200;
        final int tableWidth5=250;
        boolean new_kol;
        if (margin<230){
            new_kol=false;
        }else {
            new_kol=true;
        }
        float textx;
        final float odst=20;
        final float starty = y;
        float texty=starty-rowHeight+3;
        //width table
        int tableWidth;
        if(cols==5)tableWidth=tableWidth5;
        else tableWidth=tableWidth3;
        //start print table in pdf
        if(!new_kol){
            contentStream.drawLine(startx,starty,tableWidth+startx+marginCell,starty);
            textx=startx+marginCell;
        }else {
            contentStream.drawLine(startx+tableWidth5+odst, starty, 2*tableWidth5+(startx)+odst+marginCell,starty);
            textx=startx+marginCell+tableWidth+odst;
        }
         for(int i = 0; i < content.length; i++){
            for(int j = 0 ; j < content[i].length; j++){
                //linia pionowa
                contentStream.drawLine(textx-marginCell,texty-3,textx-marginCell,texty-3+rowHeight);
                String text=content[i][j];
                 if(text.contains("AB")){
                    contentStream.setFont(PDType1Font.HELVETICA_BOLD,10);
                }else contentStream.setFont(PDType1Font.HELVETICA,8);
                contentStream.beginText();
                contentStream.moveTextPositionByAmount(textx,texty);
                contentStream.drawString(text);
                contentStream.endText();
                switch(j){
                    case 0: textx+=30;
                        break;
                    case 1:
                        if (cols==5) textx += 120;
                        else textx+=150;
                        break;
                    case 2: textx+=15;
                        if(cols==3 ) contentStream.drawLine(textx+marginCell,texty-3,textx+marginCell,texty-3+rowHeight);
                        break;
                    case 3: textx+=40;
                        break;
                    case 4: textx+=40;
                    contentStream.drawLine(textx+marginCell,texty-3,textx+marginCell,texty-3+rowHeight);
                        break;
                }
            }
            if(new_kol){
                textx=tableWidth+startx+odst+marginCell;
                contentStream.drawLine(textx-marginCell,texty-3,textx+tableWidth,texty-3);
            }
            else {
                textx=startx+marginCell;
                contentStream.drawLine(textx-marginCell,texty-3,textx+tableWidth,texty-3);
            }
            if((texty-=rowHeight)<50){
                if(!new_kol){
                    new_kol=true;
                    contentStream.drawLine(startx,texty+10,startx+tableWidth+marginCell,texty+10);
                    texty=760-10;
                    textx=tableWidth+startx+odst+marginCell;
                    contentStream.drawLine(textx-marginCell,texty+10,textx+tableWidth,texty+10);
                }else{
                    new_kol=false;
                    contentStream.drawLine(startx+tableWidth5+odst,texty+10,startx+2*tableWidth,texty+10);
                    texty=760-10;
                    textx=startx+marginCell;
                    //here i add new page when end page height
                    //i get blank page
                    contentStream.close();
                    page=null;
                    contentStream=null;
                    nowa=new PDPage(PDPage.PAGE_SIZE_A4);
                    page=null;
                    page=nowa;
                    doc.addPage(nowa);
                    PDFont font = PDType1Font.HELVETICA;
                    contentStream1 = new PDPageContentStream(doc, nowa,false,true);
                    contentStream=contentStream1;
                    contentStream1=null;
                    contentStream.drawLine(textx,texty+10,textx+tableWidth,texty+10);
                }
            }
         }
    }

【问题讨论】:

  • 您不会关闭在drawTable 中创建的最后一个PDPageContentStream。因此,PDF 中生成的流对象可能会被破坏。请提供示例输出 PDF 以进行验证。
  • 谢谢。这个答案对我有帮助。但是,当我想生成更多没有此功能的页面时,会出现空点异常。我想在 print_sumActionPerformed (可变内容)中进一步写。现在这是不可能的,因为我有空指针。怎么办?
  • 检查 NullPointerException 发生的位置。我假设你有一个堆栈跟踪......
  • 顺便说一句,每当您的代码写入多个页面时,您都会关闭第一页的流两次,一次在 drawTable 中,一次在 print_sumActionPerformed 中。您可能想要清理代码的架构。
  • 我知道,这次我关闭了两次。但我想在drawtable中更改指向另一个页面的指针。在 print_sumActionPerformed 中使用变量内容写入另一页。变量内容必须指向下一个流页面。

标签: java pdf pdfbox


【解决方案1】:

它可能是你的构造函数。我想如果你使用:

PDPageContentStream content = new PDPageContentStream(doc, page,true,true, false);

它应该按预期工作。最后一个参数对应于构造函数中的resetContext值,决定是否重置当前图形上下文(Source)。

【讨论】:

    猜你喜欢
    • 2015-09-02
    • 2013-11-07
    • 2015-03-23
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2011-10-25
    相关资源
    最近更新 更多