2013-05-14 58 views
5

我需要創建一個PDF,它將保存執行狀態的報告,其狀態將在表結構中。使用PDFBOX API可以生成pdf表格格式嗎?使用PDFBOX API創建一個新的PDF文檔

以下是創建一個新的PDF文檔一些示例代碼:

import java.awt.Color; 
import java.io.IOException; 
import org.apache.pdfbox.exceptions.COSVisitorException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; 
import org.apache.pdfbox.pdmodel.font.PDFont; 
import org.apache.pdfbox.pdmodel.font.PDType1Font; 



public class HelloWorld 
{ 
    /** 
    * Constructor. 
    */ 
    public HelloWorld() 
    { 
     super(); 
    } 


    public static void main(String[] args) throws IOException, COSVisitorException 
    { 
     PDDocument doc = null; 
    try 
    { 
     doc = new PDDocument(); 

     PDPage page = new PDPage(); 
     doc.addPage(page); 
     PDFont font = PDType1Font.COURIER_BOLD_OBLIQUE; 
     Color color = Color.blue; 


     PDPageContentStream contentStream = new PDPageContentStream(doc, page); 
     contentStream.beginText(); 
     contentStream.setFont(font, 12); 
     contentStream.setNonStrokingColor(color); 
     contentStream.moveTextPositionByAmount(100, 700); 
     contentStream.drawString("message"); 

     contentStream.setNonStrokingColor(Color.GREEN); 
     contentStream.drawString("Hi"); 

     contentStream.endText(); 
     contentStream.close(); 
     doc.save("d:\\abc.pdf"); 
    } 
    finally 
    { 
     if(doc != null) 
     { 
      doc.close(); 
     } 
    } 
    } 
} 

回答

16

試試這個:

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 = 20f; 
     final float tableWidth = page.getCropBox().getWidth() - margin - margin; 
     final float tableHeight = rowHeight * rows; 
     final float colWidth = tableWidth/(float)cols; 
     final float cellMargin=5f; 

     //draw the rows 
     float nexty = y ; 
     for (int i = 0; i <= rows; i++) { 
      contentStream.drawLine(margin, nexty, margin+tableWidth, nexty); 
      nexty-= rowHeight; 
     } 

     //draw the columns 
     float nextx = margin; 
     for (int i = 0; i <= cols; i++) { 
      contentStream.drawLine(nextx, y, nextx, y-tableHeight); 
      nextx += colWidth; 
     } 

     //now add the text 
     contentStream.setFont(PDType1Font.HELVETICA_BOLD , 12); 

     float textx = margin+cellMargin; 
     float texty = y-15; 
     for(int i = 0; i < content.length; i++){ 
      for(int j = 0 ; j < content[i].length; j++){ 
       String text = content[i][j]; 
       contentStream.beginText(); 
       contentStream.moveTextPositionByAmount(textx,texty); 
       contentStream.drawString(text); 
       contentStream.endText(); 
       textx += colWidth; 
      } 
      texty-=rowHeight; 
      textx = margin+cellMargin; 
     } 
    } 

,只需調用此方法main功能

public static void main(String[] args) throws IOException, COSVisitorException { 
    PDDocument doc = new PDDocument(); 
    PDPage page = new PDPage(); 
    doc.addPage(page); 
    PDPageContentStream contentStream = new PDPageContentStream(doc, page); 

    String[][] content = { 
     {"Name"," Time "}, 
     {"HTC","01:25"}, 
     {"Samsung Tab2","05:30"} 
    } ; 

    drawTable(page, contentStream, 700, 100, content); 

    contentStream.close(); 
    doc.save("h:\\test.pdf"); 
} 
1
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 

import org.apache.pdfbox.pdmodel.*; 
import org.apache.pdfbox.pdmodel.graphics.xobject.*; 
import org.apache.pdfbox.pdmodel.edit.*; 
import org.apache.pdfbox.pdmodel.font.*; 


public class PDFExample { 

    public static void main(String[] args){ 
    // Create a document and add a page to it 
    try { 
    PDDocument document = new PDDocument(); 
    PDPage page = new PDPage(); 
    document.addPage(page); 

    // Image to use 
    PDXObjectImage img = new PDJpeg(document, new FileInputStream(new File("C://213480-EligibilityFormHeader.jpg"))); 

    // Create a new font object selecting one of the PDF base fonts 
    PDFont font = PDType1Font.HELVETICA_BOLD; 

    // Start a new content stream which will "hold" the to be created content 
    PDPageContentStream contentStream = new PDPageContentStream(document, page,true,true); 

    contentStream.setFont(font, 6); 
    contentStream.drawImage(img, 25, 700); 

    drawTable(page, contentStream); 

    // Make sure that the content stream is closed 
    contentStream.close(); 

    // Save the results and ensure that the document is properly closed 
    document.save("C://HelloWorld.pdf"); 
    document.close(); 
    } catch (Exception e) { 
     System.out.println("Exception is: "); 
    } 
    } 

    private static void drawTable(PDPage page, PDPageContentStream contentStream) { 
     try { 
      float y = 650; 
      float margin = 130; 

      String[] content = {"One","Two", "Date", "Score", "Score2", "Score3", "Score4", "Score5", "Score6"}; 

      final int rows = content.length; 
      final int cols = 2; 
      final float rowHeight = 22f; 
      final float tableWidth = 900.0f; 
      final float tableHeight = rowHeight * rows; 
      final float cellMargin=1f; 

      //draw the rows 
      float nexty = y ; 
      for (int i = 0; i <= rows; i++) 
      { 
       contentStream.drawLine(margin, nexty, 400, nexty); 
       nexty-= rowHeight; 
      } 

      float colWidthX [] = {200,70,0}; 

      //draw the columns 
      float nextx = margin; 
      for (int i = 0; i <= cols; i++) 
      { 
       contentStream.drawLine(nextx, y, nextx, y-tableHeight); 
       nextx += colWidthX[i] ; //colWidth; 
      } 

      //now add the text 
      float textx = margin+cellMargin; 
      float texty = y-15; 
      //textx = margin+cellMargin; 


       for(int j = 0 ; j < rows; j++) { 
        contentStream.beginText(); 
        contentStream.moveTextPositionByAmount(textx,texty); 

        contentStream.drawString(content[j]); 
        contentStream.endText(); 
        textx += colWidthX[0]+9; 
        contentStream.beginText(); 
        contentStream.moveTextPositionByAmount(textx,texty); 
        if(j==0) 
         contentStream.drawString("1"); 
        if(j==1) 
         contentStream.drawString("12345"); 
        if(j==2) 
         contentStream.drawString("05-December-2003"); 
        if(j==3) 
         contentStream.drawString("15"); 
        if(j==4) 
         contentStream.drawString("1"); 
        if(j==5) 
         contentStream.drawString("1"); 
        if(j==6) 
         contentStream.drawString("1"); 
        if(j==7) 
         contentStream.drawString("1"); 
        if(j==8) 
         contentStream.drawString("1"); 

        contentStream.endText(); 
        textx = margin+cellMargin; //colWidth; 
        texty -= rowHeight; //row height 

       } 
       texty-=rowHeight; 
       textx = margin+cellMargin; 
     } 
     catch (IOException ioe) 
     { 
      //Package.log.error(" drawTable :" + ioe); 
      final String errormsg = "Could not drawTable "; 
      //Package.log.error("In RuleThread drawTable " + errormsg, ioe); 
      throw new RuntimeException(errormsg, ioe); 
     } 
     catch (Exception ex) 
     { 
      //Package.log.error(" drawTable :" + ex); 
      final String errormsg = "Could not drawTable "; 
      //Package.log.error("In RuleThread drawTable " + errormsg, ex); 
      throw new RuntimeException(errormsg, ex); 
     } 
    } 


} 
1

我只是廣告ded pdfBOX或github的簡單包裝。它有一個簡單的表格支持,你可能可以用作cut'n粘貼基線。或者,如果你願意的話,也可以使用課程。 https://github.com/heksemann/HexPDF

+0

快速查看你的班級'cursorY =(cursorY mkl 2014-10-20 08:16:33