• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      JEE應(yīng)用系統(tǒng)生成PDF表格的解決方案

      2012-04-29 00:44:03陳本士,付立平
      電腦知識與技術(shù) 2012年2期
      關(guān)鍵詞:表格編程定義

      陳本士,付立平

      摘要: PDF形式的輸出格式愈來愈多地被商業(yè)客戶所接受.由于PDF文件具有格式整潔,所占空間小等特點,很多電子商務(wù)應(yīng)用系統(tǒng)用PDF文件做為在線表格的打印與存儲.在基于JEE技術(shù)設(shè)計的系統(tǒng)中,利用iText( JAVA開源代碼庫), Java reflection特性來生成PDF文件是一種有效的方法。

      關(guān)鍵詞:JEE應(yīng)用;PDF表格

      中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2012)02-0318-04

      1定義

      1) WEB表格:用戶從電子商務(wù)網(wǎng)站的網(wǎng)頁定義的表格輸入UI界面。

      2) PDF表格(文件):由系統(tǒng)后端處理并在網(wǎng)頁UI界面顯示的PDF表格。

      3) PDF模板:定義PDF表格的外觀,及表格數(shù)據(jù)所要填寫的field(域名)。

      2商務(wù)案例(Use Case)

      學(xué)生從學(xué)校網(wǎng)頁上輸入注冊信息:姓名,生日,性別,入學(xué)時間,專業(yè),院/系,聯(lián)系方式,住址,父母聯(lián)系方式等項目名。

      學(xué)生點擊”提交”按鈕,將所填寫的表格存入系統(tǒng)。

      學(xué)生點擊”打印”或”保存”按鈕, WEB登記表格會以PDF文件格式顯示在當(dāng)前窗口中。

      我們所討論的方案要求有以下幾個條件:

      1)預(yù)先設(shè)計好的PDF表格模版所定義的field和WEB表格所定義的field必須確保以下所定義的關(guān)系:

      {PDF Form: fieldA_1, fieldA_2, fieldA_3,…, fieldA_n}?{Web Form: fieldB_1, fieldB_2, fieldB_3…fieldB_n }

      fieldA_i 1 : 1 fieldB_j

      注: PDF field不必和WEB表格的field名字同名, PDF表格不一定包含所有的WEB表格field

      2)WEB表格數(shù)據(jù)已輸入并提交或已經(jīng)存入系統(tǒng)數(shù)據(jù)庫中。

      3)iText JAVA庫itext-1.4.4.jar文件已從http://itextpdf.com/網(wǎng)站下載, itext-1.4.4.jar文件的PATH加在系統(tǒng)環(huán)境變量CLASS_ PATH定義中。

      3方案設(shè)計

      3.1系統(tǒng)處理流程

      如圖1所示。

      3.2 JEE Design Pattern

      本系統(tǒng)設(shè)計采用了以下JEE design pattern:

      MVC

      Session Fa?ade

      Wrapper

      Transfer Object

      DAO

      3.3 Class Diagram

      如圖2所示。

      圖1

      圖2

      3.4 Sequence Diagram

      如圖3所示。

      圖3

      3.5編程細(xì)節(jié)

      3.5.1 iText類庫

      我們的設(shè)計將使用到以下iText所定義的類:

      com.lowagie.text.Document

      com.lowagie.text.DocumentException

      com.lowagie.text.PageSize

      com.lowagie.text.pdf.AcroFields

      com.lowagie.text.pdf.PdfContentByte

      com.lowagie.text.pdf.PdfImportedPage

      com.lowagie.text.pdf.PdfReader

      com.lowagie.text.pdf.PdfStamper

      com.lowagie.text.pdf.PdfWriter

      3.5.2 Value Object

      ·StudentFormVO class,此CLASS用于存取WEB表格主要學(xué)生數(shù)據(jù)

      Private String studentID;

      Private String FirstName;

      Private String LastName;

      Private String Birthdate;

      Private String Gender;

      Private String major;

      Private ContactVO studentContact;//embedded class

      Private ContactVO parentContact; embedded class

      //定義每個類成員變量的getters, setters…

      ·ContactVO class此CLASS用于存取WEB表格學(xué)生聯(lián)系信息數(shù)據(jù)

      ·Private String phoneNumber;

      ·Private String cellPhoneNumber;

      ·Private String email;

      //定義每個類成員變量的getters, setters…

      StudentPdfFormVO

      此CLASS繼承StudentFormVO class,用于存取最后生成的PDF表格數(shù)據(jù). StudentPdfFormVO

      可能要定義更多的類成員變量.讓我們以RADIO按鈕field為例,如RADIO field有3項選擇,那么在StudentFormVO只需一個類成員變量即可,而其對應(yīng)的StudentPdfFormVO則要定義3個類成員變量。

      3.5.3 ViewStudentPDFFormAction class

      ·viewStudentForm method

      功能:根據(jù)caller所傳遞的學(xué)生ID,從數(shù)據(jù)庫中讀取該學(xué)生的登記表,再把所得到的表格數(shù)據(jù)轉(zhuǎn)換成PDF格式,并寫到HTTPServeletResponse輸出流中.參數(shù): String studentId,返回數(shù)據(jù)類型:無

      主要編程邏輯如下:

      //step1: call StudentServiceSessionBean:: StudentServiceSessionBean()

      method to retrieve student submitted form data and fill data in PDF template

      //Step2: get filled pdf formbyte array variable pdf

      //step3: write pdf byte array into http servlet response stream, see code below:

      response.setContentType("application/pdf");

      if(pdf != null && pdf.length > 0)

      {

      response.setContentLength(pdf.length);}

      response.setHeader("Cache-Control", "cache, must-revalidate");

      response.setHeader("Pragma", "public");

      response.setHeader("content-transfer-encoding", "binary");

      response.setHeader("content-disposition", "inline + ; filename=" + "STUDENT_REGISTRATION_FORM.pdf");

      response.flushBuffer();

      ByteArrayInputStream fileStream =

      new ByteArrayInputStream(pdf);

      //copy fileStream to response outputStream

      3.5.4 StudentFormWrapper class

      此class主要封裝StdentPdfFormVO,及將所接收的WEB表格數(shù)據(jù)(StudentFormVO參數(shù))轉(zhuǎn)換成PDF表格在JAVA程序中對應(yīng)的StudentPdfFormVO. StudentFormWrapper還定義了很關(guān)鍵的子程序。

      getFieldValue.pdfFieldsMap class variable

      此變量用于定義PDF模板表格field name與web表格field name的對應(yīng)關(guān)系。

      HushMap key: PDF模板中所定義的filed名, value: StudentPdfFormVO對應(yīng)的filed名.

      private static Map pdfFieldsMap = new HashMap();

      PdfFieldsMap的初始化:

      Static

      {

      pdfFieldsMap.put(“first_name”,“firstName”);

      pdfFieldsMap.put(“l(fā)ast_name”,“l(fā)astName”);

      pdfFieldsMap.put(“student_id”,“studentID”);

      ...

      pdfFieldsMap.put(“student_tel”,“studentContact.phoneNumber”);

      pdfFieldsMap.put(“studentt_cell”,“studentContact.cellPhoneNumber”);

      pdfFieldsMap.put(“student_email”,“studentContact.email”);

      ...

      }

      getFieldValue() method

      此method主要用JAVA Reflection特性以獲得PdfFormVO的某一property值

      注: StudentPdfFormVO file必須和PDF表格模板保持1:1的對應(yīng)關(guān)系.

      此外對JAVA嵌套定義的value object對象,我們必須用”.”來定義層次關(guān)系,

      請參看ContactVO property : studentContact.cellPhoneNumber

      功能:返回所接受的PDF表格的field(pdfFieldName)的值

      參數(shù): String pdfFieldName, StudentPdfFormVO pdfForm

      返回數(shù)據(jù)類型: String

      主要編程邏輯如下:

      String fieldName = pdfFieldsMap.get(pdfFieldName);

      String fieldVal = "";

      ...

      try

      {fieldVal = BeanUtils.getProperty(pdfForm, fieldName); }

      ...

      return fieldVal;

      3.6 PDFFormServiceSessionBean class

      ·populatePdfFields() method

      功能:將所接受的StudentFormWrapper中所含的StudentPdfFormVO數(shù)據(jù),填寫到PDF表格模板中

      參數(shù): StudentFormWrapper wrapper, String templatePdf,返回數(shù)據(jù)類型: PdfReader,主要編程邏輯如下:

      ByteArrayOutputStream tempOut = new ByteArrayOutputStream();

      try

      {

      FileInputStream fin = new FileInputStream(new File(templatePdf));

      PdfStamper stamp = new PdfStamper(new PdfReader(fin), tempOut);

      AcroFields afields = stamp.getAcroFields();

      for(Iterator iter = afields.getFields().keySet().iterator();

      iter.hasNext();)

      { String fieldName = (String)iter.next();

      String fieldValue = wrapper.getFieldValue(fieldName);

      if(fieldName != null && fieldValue != null)

      {afields.setField(fieldName, fieldValue); } }

      stamp.setFormFlattening(true);

      stamp.close();}

      // catch block…

      // finally block…

      final PdfReader filledForm = new PdfReader(

      new ByteArrayInputStream(tempOut.toByteArray()));

      tempOut.reset();

      return filledForm;

      4總結(jié)

      本文所討論的方法是利用iText和JAVA reflection的特性來解決電子商務(wù)中一個普遍的功能需求.它具有代碼優(yōu)化,易于維護(hù)和移植等優(yōu)點.我們只需修改和value object : StudentFormWrapper類中的pdfFieldsMap類成員變量即可.

      參考文獻(xiàn):

      [1]王勇.Java編程基礎(chǔ)、實例與進(jìn)級[M].北京.清華大學(xué)出版社,2011.

      [2]王知強.管理信息系統(tǒng)[M].北京.哈爾濱工業(yè)大學(xué)出版社,2011.

      猜你喜歡
      表格編程定義
      《現(xiàn)代臨床醫(yī)學(xué)》來稿表格要求
      編程,是一種態(tài)度
      少先隊活動(2021年2期)2021-03-29 05:41:04
      元征X-431實測:奔馳發(fā)動機編程
      編程小能手
      紡織機上誕生的編程
      統(tǒng)計表格的要求
      統(tǒng)計表格的要求
      統(tǒng)計表格的要求
      成功的定義
      山東青年(2016年1期)2016-02-28 14:25:25
      修辭學(xué)的重大定義
      蒙阴县| 日喀则市| 巴里| 宁津县| 肇源县| 巴林右旗| 桂阳县| 武宁县| 上犹县| 周口市| 大宁县| 景宁| 鲁甸县| 高安市| 长阳| 西畴县| 青阳县| 轮台县| 罗田县| 武强县| 千阳县| 东海县| 三门县| 石楼县| 灵武市| 商城县| 隆尧县| 长治县| 偃师市| 新和县| 会宁县| 垣曲县| 彭泽县| 康马县| 离岛区| 兴隆县| 梁平县| 新兴县| 临武县| 乐都县| 绿春县|