Java pdfbox生成多页
当我生成第二页时,我得到一个空白页。我有两个功能。一个生成包含文本的表格,另一个生成PDF。当在第一页结束的地方,我添加了另一页,我想写在新的页面。打开生成的PDF文件时,第二页为空白:Java pdfbox生成多页,java,pdf,pdfbox,Java,Pdf,Pdfbox,当我生成第二页时,我得到一个空白页。我有两个功能。一个生成包含文本的表格,另一个生成PDF。当在第一页结束的地方,我添加了另一页,我想写在新的页面。打开生成的PDF文件时,第二页为空白: //global variables PDPage nowa=null; PDPageContentStream contentStream1 = null; //function to generate table private void print_sumActionPerformed(java
//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);
}
}
}
}
private void drawTable(PDPage page,PDPageContentStream contentStream,float y,float margin,String[]content,PDDocument doc)抛出IOException,interruptedeexception{
最终int行=content.length;
final int cols=内容[0]。长度;
最终浮动行高=13f;
最终浮动保证金=5;
最终浮点数startx=30;
最终int表宽3=200;
最终int表宽5=250;
布尔新布尔;
如果(margin它可能是您的构造函数。我认为如果您使用:
PDPageContentStream content = new PDPageContentStream(doc, page,true,true, false);
它应该按预期工作。最后一个参数对应于构造函数中的resetContext
值,并决定是否应重置当前图形上下文()。它可能是您的构造函数。我认为如果您使用:
PDPageContentStream content = new PDPageContentStream(doc, page,true,true, false);
它应按预期工作。最后一个参数对应于构造函数中的resetContext
值,并决定是否应重置当前图形上下文().您没有关闭在drawTable
中创建的最后一个PDPageContentStream
。因此,PDF中生成的流对象可能会被破坏。请提供一个示例输出PDF进行验证。谢谢。此答案对我有帮助。但是,如果我想在不使用此函数的情况下生成更多页面,则会出现get null point异常。我想在pr中进一步写入已执行的汇总(可变内容)。现在这是不可能的,因为我有空指针。如何做?检查空指针异常发生的位置。我假设您有堆栈跟踪…顺便说一句,每当您的代码写入多个页面时,您都会在第一页关闭流两次,一次在drawTable
中,一次在print\u sumActionPerformed
中。您可能需要清理-up代码的体系结构。我知道,这次我关闭了两次。但我想在drawtable中更改指向另一页的指针。在打印时,使用可变内容写入另一页。可变内容必须指向下一个流页面。您不关闭在drawtable
中创建的最后一个PDPageContentStream
。因此,结果PDF中的数据流对象可能已损坏。请提供一个示例输出PDF以进行验证。谢谢。此答案对我有帮助。但是,如果我想在没有此函数的情况下生成更多页面,则会出现get null point异常。我想在print_sumActionPerformed(可变内容)中进一步写入。现在这是不可能的,因为我有空指针。如何做?检查空指针异常发生的位置。我假设您有堆栈跟踪…顺便说一句,每当您的代码写入多个页面时,您都会在第一页关闭流两次,一次在drawTable
中,一次在print\u sumActionPerformed
中。您可能需要清理-up代码的体系结构。我知道,这次我关闭了两次。但我希望在drawtable中更改指向另一页的指针。在print__操作中,使用变量内容写入另一页。变量内容必须指向下一个流页面。