将SQL查询打印到PDF文件

时间:2018-03-23 08:17:26

标签: java mysql pdfbox

我正在使用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)

0 个答案:

没有答案