我正在使用PDFBox在Java中创建PDF文件。现在我有一个任务是将SQL查询打印到PDF文件。我在Google上找到了一个解决方案并尝试使用我的代码。编译很好,但是当我继续创建PDF文件时,它会引发异常错误。
这是我的代码:
复制String数组:
public static String[][] append(String[][] a, String[][] b){
String[][] result = new String[a.length + b.length][];
System.arraycopy(a, 0, result, 0, a.length);
System.arraycopy(b, 0, result, a.length, b.length);
return result;
}
用于在pdf文件上生成表格单元格
public static void drawTable(PDPage page,PDPageContentStream contentStream,float y,float margin,String[][] content)throws IOException{
final int rows = content.length;
final int cols = content[0].length;
final float rowHeight = 20.0f;
final float tableWidth = page.getMediaBox().getWidth()-(2.0f*margin);
final float tableHeight = rowHeight*(float)rows;
final float colWidth = tableWidth/(float)cols;
final float cellMargin = 2f;
//draw rows
float nexty = y;
for(int i=0;i<=rows;i++){
//contentStream.drawLine(margin, nexty, margin+tableWidth,nexty);
contentStream.moveTo(margin,nexty);
contentStream.lineTo(margin+tableWidth,nexty);
contentStream.stroke();
nexty -= rowHeight;
}
//draw cols
float nextx = margin;
for(int i=0;i<=cols;i++){
//contentStream.drawLine(nextx,y,nextx,y-tableHeight);
contentStream.moveTo(nextx,y);
contentStream.lineTo(nextx,y-tableHeight);
contentStream.stroke();
nextx += colWidth;
}
//Add strings
contentStream.setFont(PDType1Font.HELVETICA_BOLD,6);
float textx = margin + cellMargin;
float texty = y - 15.0f;
for(final String[] aContent : content){
for(String text : aContent){
//String text = content[i][j];
contentStream.beginText();
contentStream.newLineAtOffset(textx, texty);
contentStream.showText(text);//Error points here
contentStream.endText();
textx += colWidth;
}
texty -= rowHeight;
textx = margin + cellMargin;
}
}
用于恢复数据和启动PDF转换
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
int x = JOptionPane.showConfirmDialog(null,"Proceed to generate report for user '"+uName+"'?","Warning",JOptionPane.YES_NO_OPTION);
if (x == JOptionPane.YES_NO_OPTION){
Connection conn = null;
PreparedStatement ps = null;
String query = "SELECT * FROM invoice";//Static for testing purposes
String[][] content = {{"invoiceNumber","amount","issueDate","ticketNumber","userAccount"}};
try{
conn = getConnection();
ps = conn.prepareStatement(query);
ResultSet rs = ps.executeQuery();
while(rs.next()){
String[][] data = {{rs.getString("invoiceNumber"),
rs.getString("amount"),
rs.getString("issueDate"),
rs.getString("ticketNumber"),
rs.getString("userAccount")}};
content = append(content,data);
}
} catch (SQLException ex) {
Logger.getLogger(adminRequests.class.getName()).log(Level.SEVERE, null, ex);
}finally{
try{
if(ps != null){
ps.close();
}
if(conn != null){
conn.close();
}
}catch(SQLException e){
Logger.getLogger(adminRequests.class.getName()).log(Level.SEVERE, null, e);
}
}
try{
PDDocument doc = new PDDocument();
PDPage page = new PDPage();
doc.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(doc,page);
PDFont font = PDType1Font.HELVETICA_BOLD;
contentStream.beginText();
contentStream.setFont(font,12);
contentStream.newLineAtOffset(30, 700);
contentStream.showText( "Sales Report" );
contentStream.endText();
drawTable(page, contentStream,690,30,content);//Also an Error here
contentStream.close();
doc.save("C:\\Users\\Ellie Reyes\\Documents\\NetBeansProjects\\ForTu\\Queries\\"+txtFileName.getText()+"");
doc.close();
System.out.println("PDF generated");
} catch (IOException ex) {
Logger.getLogger(adminRequests.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
这是错误
> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
> at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:318) at
> org.apache.pdfbox.pdmodel.PDPageContentStream.showText(PDPageContentStream.java:418)
> at fortu.adminRequests.drawTable(adminRequests.java:113) at
> fortu.adminRequests.jButton1MouseClicked(adminRequests.java:400) at
> fortu.adminRequests.access$000(adminRequests.java:30) at
> fortu.adminRequests$1.mouseClicked(adminRequests.java:165) at
> java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:270)
> at java.awt.Component.processMouseEvent(Component.java:6536) at
> javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at
> java.awt.Component.processEvent(Component.java:6298) at
> java.awt.Container.processEvent(Container.java:2237) at
> java.awt.Component.dispatchEventImpl(Component.java:4889) at
> java.awt.Container.dispatchEventImpl(Container.java:2295) at
> java.awt.Component.dispatchEvent(Component.java:4711) at
> java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4889)
> at
> java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
> at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4467)
> at java.awt.Container.dispatchEventImpl(Container.java:2281) at
> java.awt.Window.dispatchEventImpl(Window.java:2746) at
> java.awt.Component.dispatchEvent(Component.java:4711) at
> java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at
> java.awt.EventQueue.access$500(EventQueue.java:97) at
> java.awt.EventQueue$3.run(EventQueue.java:709) at
> java.awt.EventQueue$3.run(EventQueue.java:703) at
> java.security.AccessController.doPrivileged(Native Method) at
> java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
> at
> java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
> at java.awt.EventQueue$4.run(EventQueue.java:731) at
> java.awt.EventQueue$4.run(EventQueue.java:729) at
> java.security.AccessController.doPrivileged(Native Method) at
> java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
> at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at
> java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
> at
> java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
> at
> java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
> at
> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
> at
> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
> at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)