一起来导出pdf

一起来导出pdf

first of all 准备: --------------------------

1.能运行J2EE的开发环境

2. 库文件 DynamicPDF.jar

3.工具(电脑,人脑)

second开始:------------------------------

一.JSP页面

 

1.写一个简单的JS 函数 clickButton

function clickButton(button){
document.InvoiceDisplayForm.<%=ac.getProperty("butOption")%>.value = button;
document.InvoiceDisplayForm.submit();
}

 

2.加一个隐含变量

<input type="hidden" name="<%=ac.getProperty("butOption")%>" value="">

3.合适的位置加上这个就ok啦

<a href="javascript:clickButton('export2Pdf')">

<img align="absmiddle" src="/internal/image/gif/pdficon.gif" width="18" height="18" border="0">

(这是图片连接,可以换成文字   [导出为pdf]   )

</a>

 

二.worker部分 ( 定义类时加上属性 private AppConfig ac;)

1. 导入包

   // packages for pdf
import com.l5m.internal.bean.*;
import com.l5m.internal.util.*;
import com.cete.dynamicpdf.PageSize;
import com.cete.dynamicpdf.pageelements.Label;
import com.cete.dynamicpdf.pageelements.CellList;
import com.cete.dynamicpdf.Align;
import com.cete.dynamicpdf.TextAlign;
import java.io.FileNotFoundException;
import com.cete.dynamicpdf.pageelements.RowList;
import com.cete.dynamicpdf.PageOrientation;
import com.cete.dynamicpdf.pageelements.Cell;
import com.cete.dynamicpdf.pageelements.ColumnList;
import com.cete.dynamicpdf.Page;
import com.cete.dynamicpdf.pageelements.Image;
import com.cete.dynamicpdf.Template;
import com.cete.dynamicpdf.RgbColor;
import java.text.SimpleDateFormat;
import com.cete.dynamicpdf.pageelements.PageNumberingLabel;
import com.cete.dynamicpdf.pageelements.Table;
import com.cete.dynamicpdf.pageelements.Row;
import com.cete.dynamicpdf.Document;
import com.cete.dynamicpdf.pageelements.CellAlign;
import com.cete.dynamicpdf.pageelements.CellVAlign;

 

2.JSP里面鼠标点击处理函数

public void processDisplayMode(HttpServletRequest request,
                                 HttpSession session,
                                 DbHandler dh) throws
      SQLException, ClassNotFoundException {

AppConfig ac = AppConfig.getInstance();

String butClicked = request.getParameter(ac.getProperty("butOption")) != null ?
        request.getParameter(ac.getProperty("butOption")) : "";

if (butClicked.equals("export2Pdf")){
      String filePath = getAppHomeDir() + ac.getProperty("curvePath");
      String fileName = this.getUserId() + System.currentTimeMillis() + ".pdf";
      this.generatePDF(session, fileName, dh);
    }

}

 

3.pdf具体的处理方法 generatePDF()

private void generatePDF(
    HttpSession session, String fileName, DbHandler dh)
    throws SQLException, ClassNotFoundException{

    try{
      HttpServletResponse response = getResponse();
      response.setContentType("application/pdf");
      response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
      Document document = new Document();
      document.addLicense(GeneralConstants.PDF_LICENSE_KEY);

      int pageWidth = this.getPDFPageWidth(session);
      Page page = this.getPDFPageInstance(pageWidth);

      HashMap navBarAccessMap = (HashMap)session.getAttribute(
        UserCompanyWorker.NAV_ACCESS_BEAN);
      String programName = "L5M Internal" + "\n";
      programName += this.getPDFNavBarTitle(navBarAccessMap, CATEGORY_KEY) + " - ";
      programName += this.getPDFNavBarTitle(navBarAccessMap, PROGRAM_KEY);
      String userName = DataUtil.getUserFullName(dh, getUserBean().getUserId());
      document.setAuthor(userName);
      document.setTitle(programName);

      Template template = new Template();
      this.setupPDFDocumentTemplate(template, page);
      document.setTemplate(template);
      this.setupPDFHeader(session, page, programName, userName);
      boolean hasSetupFooter = false;

      Table table = this.getPDFTable(session, page);
      page.getElements().add(table);
      document.getPages().add(page);
      Table tableOF = table.getOverflowRows();
      while (tableOF != null){
        Page pageOF = this.getPDFPageInstance(pageWidth);
        pageOF.getElements().add(tableOF);
        float offsetY = tableOF.getVisibleHeight() + 65; // last table +
                // table start (used
                // for footer)
        document.getPages().add(pageOF);
        tableOF = tableOF.getOverflowRows();
        if (tableOF == null){
          this.setupPDFFooter(session, pageOF, offsetY);
          hasSetupFooter = true;
        }
      }

      if (!hasSetupFooter){
        float offsetY = table.getVisibleHeight() + 65; // last table + table
               // start
        this.setupPDFFooter(session, page, offsetY);
      }
      document.draw(response.getOutputStream());
    }
    catch (Exception e){
      e.printStackTrace();
    }
}

private String getPDFNavBarTitle(HashMap navBarAccessMap, String code){
    String title = "No Title";
    if (navBarAccessMap.containsKey(code)){
      NavigationItemBean itemBean = (NavigationItemBean)navBarAccessMap.get(code);
      if (itemBean.getDisplayName() != null) title = itemBean.getDisplayName();
    }
    return title;
}

// normal ~50; large ~150
private int getPDFPageWidth(HttpSession session){
    int pageWidth = 0;
    DataTable dataTable = (DataTable)session.getAttribute("dataTable");
    if (dataTable == null) return 0;

    DataNode[][] headerNodes = dataTable.getHeaderNodes();

    pageWidth += 150;
    pageWidth += 20;
    pageWidth += 50;

    int levelCount = headerNodes.length;
    int lastLevelIndex = levelCount - 1;
    for (int i = 0; i < headerNodes[lastLevelIndex].length; i++){
      pageWidth += 50;
    }

    return pageWidth + 100;
}

private Page getPDFPageInstance(int pageWidth){
    Page page = new Page(PageSize.LETTER, PageOrientation.LANDSCAPE);
    if (pageWidth > page.getDimensions().getWidth()){
      page.getDimensions().setWidth(pageWidth);
    }
    return page;
}

private void setupPDFDocumentTemplate(Template template, Page page)
    throws FileNotFoundException{
    float x, y, w, h;

    String token = "%%CP(1)%% of %%TP(1)%%";
    x = page.getDimensions().body.getWidth() - 100;
    y = page.getDimensions().body.getHeight() - 25;
    w = 100;
    h = 25;
    PageNumberingLabel labelPN = new PageNumberingLabel(
      token, x, y, w, h,
      com.cete.dynamicpdf.Font.getHelvetica(), 12, TextAlign.RIGHT);
    template.getElements().add(labelPN);
}

private void setupPDFHeader(
    HttpSession session, Page page, String programName, String userName)
    throws FileNotFoundException{

    Label labelProgram = new Label(
      programName, 0, 0, page.getDimensions().body.getWidth() / 2, 100,
      com.cete.dynamicpdf.Font.getHelveticaBold(), 12, TextAlign.LEFT);

    String imgPath = getAppHomeDir() + "/image/";
    Image imageLogo = new Image(
      imgPath + "Inter-ViewButton_01.PNG",
      page.getDimensions().body.getWidth(), 0);
    imageLogo.setAlign(Align.RIGHT);

    Calendar cal = Calendar.getInstance();
    java.util.Date date = cal.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("M/d/yyyy");

    String strRunningInfo = this.getRunningTimeInfo(session);

    String strUserDate = " " + userName + "\n " + sdf.format(date) + "\t\t\t" + strRunningInfo;
    Label labelUserDate = new Label(
      strUserDate, 0, 28, page.getDimensions().body.getWidth(), 100,
      com.cete.dynamicpdf.Font.getHelvetica(), 10, TextAlign.LEFT);

    page.getElements().add(labelProgram);
    page.getElements().add(imageLogo);
    page.getElements().add(labelUserDate);
}

private void setupPDFFooter(HttpSession session, Page page, float offsetY){

    String strDB = "DB Provider: Fifth";
    Label labelDB = new Label(
      strDB, 0, offsetY, 400, 100,
      com.cete.dynamicpdf.Font.getHelvetica(), 10, TextAlign.LEFT);

    List selRecordType = (List)session.getAttribute("selRecordType");
    String strRecordType = "Record Types: ";
    for (int i = 0; i < PBRRawCountWorker.RECORD_TYPE.length; i++){
      if (selRecordType.contains(i + "")){
        strRecordType += PBRRawCountWorker.RECORD_TYPE[i] + " ";
      }
    }

    Label labelRecordType = new Label(
      strRecordType, 0, offsetY + 10, 400, 100,
      com.cete.dynamicpdf.Font.getHelvetica(), 10, TextAlign.LEFT);

    page.getElements().add(labelDB);
    page.getElements().add(labelRecordType);
}

private Table getPDFTable(HttpSession session, Page page){
    Table table = new Table(
      0, 55, page.getDimensions().body.getWidth(),
      page.getDimensions().body.getHeight() - 80,
      com.cete.dynamicpdf.Font.getHelvetica(), 12);
    table.setBorderWidth(1);
    table.setRepeatColumnHeaderCount(4);

    this.setupPDFTableColumns(session, table);
    this.setupPDFTableHeader(session, table);
    this.setupPDFTableBody(session, table);
    return table;
}

private void setupPDFTableColumns(HttpSession session, Table table){
    DataTable dataTable = (DataTable)session.getAttribute("dataTable");
    if (dataTable == null) return;

    DataNode[][] headerNodes = dataTable.getHeaderNodes();

    ColumnList colList = table.getColumns();
    colList.add(150);
    colList.add(60);
    colList.add(50);

    int levelCount = headerNodes.length;
    int lastLevelIndex = levelCount - 1;
    for (int i = 0; i < headerNodes[lastLevelIndex].length; i++){
      colList.add(50);
    }
    colList.add(50);
}

private void setupPDFTableHeader(HttpSession session, Table table){
    DataTable dataTable = (DataTable)session.getAttribute("dataTable");
    if (dataTable == null) return;
    DataNode[][] headerNodes = dataTable.getHeaderNodes();

    RowList rowList = table.getRows();
    Row row1 = rowList.add(com.cete.dynamicpdf.Font.getHelveticaBold(), PDF_FONT_SIZE);

    CellList cellList1 = row1.getCellList();
    cellList1.add("").setRowSpan(headerNodes.length);
    cellList1.add("").setRowSpan(headerNodes.length);
    cellList1.add("Average").setRowSpan(headerNodes.length);
    for (int i = 0; i < headerNodes[0].length; i++){
      String header = headerNodes[0][i].getDisplayKey();
      if (header.indexOf("/") != -1){
        header = header.substring(header.indexOf("/") + 1);
      }
      int columnSpan = headerNodes[0][i].getColspan();
      cellList1.add(header).setColumnSpan(columnSpan);
    }
    cellList1.add("Total").setRowSpan(headerNodes.length);

    for (int i = 0; i < cellList1.getCount(); i++){
      Cell cell = cellList1.getCell(i);
      cell.setAlign(CellAlign.CENTER);
      cell.setVAlign(CellVAlign.CENTER);
    }

    for (int i = 1; i < headerNodes.length; i++){
      Row row2 = rowList.add(com.cete.dynamicpdf.Font.getHelveticaBold(), PDF_FONT_SIZE);
      CellList cellList2 = row2.getCellList();

      for(int j = 0; j < headerNodes[i].length; j++){
        String header = headerNodes[i][j].getDisplayKey();
        if (header.indexOf("/") != -1){
          header = header.substring(header.indexOf("/") + 1);
        }
        int columnSpan = headerNodes[i][j].getColspan();
        cellList2.add(header).setColumnSpan(columnSpan);
      }
      for (int j = 0; j < cellList2.getCount(); j++){
        Cell cell = cellList2.getCell(j);
        cell.setAlign(CellAlign.CENTER);
        cell.setVAlign(CellVAlign.CENTER);
      }
    }
}

private void setupPDFTableBody(HttpSession session, Table table){
    final String[] WEEKDAYS = {"M", "T", "W", "T", "F", "S", "S"};
    DataTable dataTable = (DataTable)session.getAttribute("dataTable");
    if (dataTable == null) return;
    Map averageMap = (Map)session.getAttribute("averageMap");
    if (averageMap == null) averageMap = new HashMap();

    boolean isOdd = false;
    RowList rowList = table.getRows();

    String selHightlightText = (String)session.getAttribute("selHightlightText");
    DataNode[] yNodes = dataTable.getYNodes();
    double[][] xTotals = dataTable.getXTotals();
    double[][] yTotals = dataTable.getYTotals();
    double[][][] valueArrays = dataTable.getValueArrays();

    for (int i = 0; i < yNodes.length; i++){
      Row row = rowList.add(com.cete.dynamicpdf.Font.getHelveticaBold(), PDF_FONT_SIZE);
      CellList cellList = row.getCellList();

      RgbColor rowBackground = null;
      if ((i % WEEKDAYS.length) == 0) isOdd = !isOdd;
      if (isOdd) rowBackground = new RgbColor(245, 245, 220);
      else rowBackground = new RgbColor(255, 255, 255);
      row.setBackgroundcolor(rowBackground);

      String displayKey = yNodes[i].getDisplayKey();
      if ((i % WEEKDAYS.length) == 0){
        String rowHeader = displayKey.substring(0, displayKey.lastIndexOf("_"));
        Cell cell = cellList.add(rowHeader);
        cell.setRowSpan(WEEKDAYS.length);
        cell.setFontSize(10);
      }

      int indexWD = Integer.parseInt(yNodes[i].getDisplayKey().substring(
        yNodes[i].getDisplayKey().indexOf("_") + 1)) - 2;
      String weekday = WEEKDAYS[indexWD];
      cellList.add(weekday).setFontSize(10);

      double average = Double.parseDouble((String)averageMap.get(displayKey));
      String strAVG = Helper.formatNumeric(average, 0);
      Cell cellAVG = cellList.add(strAVG);
      cellAVG.setFont(com.cete.dynamicpdf.Font.getHelvetica());
      cellAVG.setFontSize(10);
      for(int k = 0; k < valueArrays[i].length; k++){
        RgbColor foreground = new RgbColor(0, 0, 0); // black
        RgbColor background = rowBackground;
        double value = valueArrays[i][k][0];

        if ((valueArrays[i][k] == null || value == 0)){
          background = new RgbColor(255, 255, 0); // yellow
        }
        else{
          double countPercent = ((value - average) / average) * 100;
          if (countPercent < 0)countPercent = -(countPercent);
          if (countPercent > (Double.parseDouble(selHightlightText))){
            background = new RgbColor(255, 0, 255); // magenta
          }
        }

        String strValue = (value > 0) ? Helper.formatNumeric(value, 0) : "";
        Cell cell = cellList.add(strValue);
        cell.setBackgroundColor(background);
        cell.setTextColor(foreground);
        cell.setFont(com.cete.dynamicpdf.Font.getHelvetica());
        cell.setFontSize(10);
      }

      RgbColor foreground = new RgbColor(0, 0, 0); // black
      RgbColor background = rowBackground;
      if (yTotals[i]==null||yTotals[i][0] == 0){
        background = new RgbColor(255, 255, 0); // yellow
      }
      double total = yTotals[i][0];
      String strTotal = Helper.formatNumeric(total, 0);
      Cell cellTotal = cellList.add(strTotal);
      cellTotal.setBackgroundColor(background);
      cellTotal.setTextColor(foreground);
      cellTotal.setFont(com.cete.dynamicpdf.Font.getHelvetica());
      cellTotal.setFontSize(10);

      for (int k = 0; k < cellList.getCount(); k++){
        Cell cell = cellList.getCell(k);
        cell.setAlign(CellAlign.CENTER);
        cell.setVAlign(CellVAlign.CENTER);
      }
    }

    Row row = rowList.add(com.cete.dynamicpdf.Font.getHelveticaBold(), PDF_FONT_SIZE);
    CellList cellList = row.getCellList();
    Cell cellTotalLabel = cellList.add("Total");
    cellTotalLabel.setColumnSpan(3);
    cellTotalLabel.setAlign(CellAlign.LEFT);

    for (int x = 0; x < xTotals.length; x++){
      RgbColor foreground = new RgbColor(0, 0, 0); // black
      RgbColor background = new RgbColor(255, 255, 255); // white
      if ((xTotals[x] == null) || (xTotals[x][0] == 0)){
        background = new RgbColor(255, 255, 0); // yellow
      }

      double total = xTotals[x][0];
      String strTotal = (xTotals[x][0] > 0) ? Helper.formatNumeric(total, 0) : "";

      Cell cellTotal = cellList.add(strTotal);
      cellTotal.setBackgroundColor(background);
      cellTotal.setTextColor(foreground);
      cellTotal.setFontSize(10);
    }

    for (int k = 0; k < cellList.getCount(); k++){
      Cell cell = cellList.getCell(k);
      cell.setAlign(CellAlign.CENTER);
      cell.setVAlign(CellVAlign.CENTER);
    }

}


private String getRunningTimeInfo(HttpSession session){
     Long longStart = (Long)session.getAttribute(CountInfoUtil.RUNNING_START_TIME);
     long valueStart = (longStart != null) ? longStart.longValue() : 0;
     Long longEnd = (Long)session.getAttribute(CountInfoUtil.RUNNING_END_TIME);
     long valueEnd = (longEnd != null) ? longEnd.longValue() : 0;

     Calendar cal = Calendar.getInstance();
     cal.setTimeInMillis(valueStart);
     SimpleDateFormat formatter2 = new SimpleDateFormat("HH:mm:ss a");
     long timeDiff = (valueEnd - valueStart) / 1000;
     long hour = timeDiff / 3600;
     long minute = timeDiff % 3600 / 60;
     long second = timeDiff % 60;

     StringBuffer sb = new StringBuffer();
     sb.append("Running Starts at ").append(formatter2.format(cal.getTime()));
     sb.append(" Duration: ");
     sb.append(hour).append("h:");
     sb.append(minute).append("m:");
     sb.append(second).append("s");
     return sb.toString();
   }

 

 

当然了,最终你要导出的具体内容就修改上面的函数就ok了.我也是刚接触这个pdf组件.

你可能感兴趣的:(一起来导出pdf)