㈠ java工程師面試時最看重的是什麼
一、專業技能
熟練的使用Java語言進行面向對象程序設計,有良好的編程習慣,熟悉常用的JavaAPI,包括集合框架、多線程(並發編程)、I/O(NIO)、Socket、JDBC、XML、反射等。
熟悉基於JSP和Servlet的JavaWeb開發,對Servlet和JSP的工作原理和生命周期有深入了解,熟練的使用JSTL和EL編寫無腳本動態頁面,有使用監聽器、過濾器等Web組件以及MVC架構模式進行JavaWeb項目開發經驗。
對Spring的IoC容器和AOP原理有深入了解,熟練的運用Spring框架管理各種Web組件及其依賴關系,熟練的使用Spring進行事務、日誌、安全性等的管理,有使用SpringMVC作為表示層技術以及使用Spring提供的持久化支持進行Web項目開發的經驗,熟悉Spring對其他框架的整合。
熟練的使用Hibernate、MyBatis等ORM框架,熟悉Hibernate和MyBatis的核心API,對Hibernate的關聯映射、繼承映射、組件映射、緩存機制、事務管理以及性能調優等有深入的理解。
熟練的使用HTML、CSS和JavaScript進行Web前端開發,熟悉jQuery和Bootstrap,對Ajax技術在Web項目中的應用有深入理解,有使用前端MVC框架(AngularJS)和JavaScript模板引擎(HandleBars)進行項目開發的經驗。
熟悉常用的關系型資料庫產品(MySQL、Oracle),熟練的使用SQL和PL/SQL進行資料庫編程。
熟悉面向對象的設計原則,對GoF設計模式和企業應用架構模式有深入的了解和實際開發的相關經驗,熟練的使用UML進行面向對象的分析和設計,有TDD(測試驅動開發)和DDD(領域驅動設計)的經驗。
熟悉Apache、NginX、Tomcat、WildFly、Weblogic等Web伺服器和應用伺服器的使用,熟悉多種伺服器整合、集群和負載均衡的配置。
熟練的使用產品原型工具Axure,熟練的使用設計建模工具PowerDesigner和Enterprise Architect,熟練的使用Java開發環境Eclipse和IntelliJ,熟練的使用前端開發環境WebStorm,熟練的使用軟體版本控制工具SVN和Git,熟練的使用項目構建和管理工具Maven和Gradle。
說明: 上面羅列的這些東西並不是每一項你都要爛熟於心,根據企業招聘的具體要求可以做相應的有針對性的准備。但是前6項應該是最低要求,是作為一個Java軟體工程師必須要具備的專業技能。
二、項目經驗
項目介紹
本系統是X委託Y開發的用於Z的系統,系統包括A、B、C、D等模塊。系統使用了Java企業級開發的開源框架E以及前端技術F。表示層運用了G架構,使用H作為視圖I作為控制器並實現了REST風格的請求;業務邏輯層運用了J模式,並通過K實現事務、日誌和安全性等功能,通過L實現緩存服務;持久層使用了M封裝CRUD操作,底層使用N實現數據存取。整個項目採用了P開發模型。 說明: E通常指spring(Java企業級開發的一站式選擇); F最有可能是jQuery庫及其插件或者是Bootstrap框架,當然如果要構建單頁應用(SPA)最佳的方案是前端MVC框架(如AngularJS)和JavaScript模板引擎(如HandleBars);G顯然是MVC(模型-視圖-控制),最有可能的實現框架是spring MVC,除此之外還有Struts 2、JSF以及Apache為JSF提供的MyFaces實現; H是JSP,JSP作為MVC中的V,也可使用模板引擎(如Freemarker和Velocity)來生成視圖還可以是各種文檔或報表(如Excel和pdf等); I是Servlet或者自定義的控制器,他們是MVC中的C,當然Spring MVC中提供了作為前端控制器的DispatcherServlet; J通常是事務腳本; K應該是AOP(面向切面編程)技術; L目前廣泛使用的有memcached和Redis; M的選擇方案很多,最有可能的是hibernate和MyBatis,也可以兩種技術同時運用,但通常是將增刪改交給hibernate來處理,而復雜的查詢則由MyBatis完成,此外TopLink、jOOQ也是優秀的持久層解決方案; N底層的數據存取傳統上是使用關系型資料庫,可以是MySQL、Oracle、SQLServer、DB2等,隨著大數據時代的來臨,也可以採用NoSQL(如MongoDB、MemBase、BigTable等)和其他大數據存取方案(如GFS、HDFS等); P是項目的開發模型,可以是瀑布模型、快速原型模型、增量模型、螺旋模型、噴泉模型、RAD模型等。
項目開發流程
1、可行性分析:可行性分析報告、項目開發計劃書;
2、需求分析:需求規格說明書OOAD(用例圖、時序圖、活動圖);
界面原型:幫助理解需求、業務層設計時推導事務腳本;
3、設計:概要設計說明書、詳細設計說明書;
*抽取業務實體(領域對象):類圖、E-R圖(概念設計階段);
分層架構:確定各層的技術實現方案(具體到使用的框架、資料庫伺服器、應用伺服器等);
*業務層設計:事務腳本模式(事務:用戶發送一次請求就是一個事務;
腳本:一個方法或一個函數;
*事務腳本:把一次請求封裝為一個方法或一個函數;事務腳本模式:一個事務開始於腳本的打開,終止於腳本的關閉);
*業務層涉及的對象有三種類型:事務腳本類(封裝了業務的流程)、數據訪問對象(DAO,封裝了持久化操作)、數據傳輸對象(DTO,封裝了失血/貧血領域對象),三者之間的關系是事務腳本類組合(聚合)數據訪問對象,這二者都依賴了數據傳輸對象正向工程(UML類圖生成Java代碼)和逆向工程(Java代碼生成UML類圖)資料庫物理設計(ER圖轉換成表間關系圖、建庫和建表、使用工具插入測試數據);
3、編碼;
4、測試:測試報告、缺陷報告;
*單元測試:對軟體中的最小可測試單元進行檢查和驗證,在Java中是對類中的方法進行測試,可以使用JUnit工具來實施;
*集成測試:集成測試也叫組裝測試或聯合測試。在單元測試的基礎上,將所有模塊按照設計要求組裝成為子系統進行測試;
*系統測試:將已經確認的軟體、硬體、外設、網路等元素結合在一起,進行信息系統的各種組裝測試和確認測試,系統測試是針對整個產品系統進行的測試,目的是驗證系統是否滿足了需求規格的定義,找出與需求規格不符或與之矛盾的地方,從而提出更加完善的方案;
*驗收測試:在軟體產品完成了單元測試、集成測試和系統測試之後,產品發布之前所進行的軟體測試活動。它是技術測試的最後一個階段,也稱為交付測試。驗收測試的目的是確保軟體准備就緒,並且可以讓最終用戶將其用於執行軟體的既定功能和任務;
5、交付和維護:用戶手冊、操作手冊;
三、項目管理
版本控制:CVS/SVN/Git
自動構建:Ant/Maven/Ivy/Gradle
持續集成:Hudson/Jenkins
四、系統架構
負載均衡伺服器:F5、A10;
應用伺服器: HTTP伺服器:Apache、NginX(HTTP、反向代理、郵件代理伺服器);
Servlet容器:Tomcat、Resin
EJB容器:WildFly(JBoss Application Server)、GlassFish、Weblogic、Websphere;
資料庫伺服器:MySQL、Eclipse、Oracle;
五、第三方工具(插件)應用
圖表工具:基於jQuery的圖表插件(如jQchart、Flot、Charted等)、Chart.js、Highcharts等。
報表工具:Pentaho Reporting、iReport、DynamicReports等。
文檔處理:POI、iText等。
工作流引擎:jBPM、OpenWFE、Snaker、SWAMP等。
作業調度:Quartz、JobServer、Oddjob等。
緩存服務:EhCache、memcached、SwarmCache等。
消息隊列:Open-MQ、ZeroMQ、ActiveMQ等。
安全框架:Shiro、PicketBox等。
搜索引擎:IndexTank、Lucene、ElasticSearch等。
Ajax框架:jQuery、ExtJS、DWR等。
UI插件:EasyUI、MiniUI等。
富文本框:UEditor、CKEditor等。
六、面試提問
項目是為哪個公司開發的?項目的投入是多少?
有多少人參與了項目開發?整個團隊中,測試人員、開發人員、項目經理比例是多少?
項目開發了多長時間?項目總的代碼量有多少?你的代碼量有多少?
項目採用了怎樣的開發模型或開發流程?項目的架構是怎樣的?項目的技術選型是怎樣的?
你在項目中擔了怎樣的職責?是否經常開會或加班?項目完成後有哪些收獲或是經驗教訓?
項目中最困難的部分是什麼?如何解決團隊開發時遇到的各種沖突?
七、面試時可以反問面試官的問題
我注意到你們使用了X技術,請問你們是如何解決Y問題的?
為什麼你們的產品使用了X技術而不是Y技術?據我所知,X技術雖然有A、B、C等好處,但也存在D和E問題,而Y技術可以解決D和E問題。
我對您說的X技術不是太熟悉,但我感覺它是一個不錯的解決方案,您能多講講它的工作原理嗎?
你們團隊是如何進行項目規劃的?一周會有幾次例會?每周的代碼量大概是多少?
就X問題我能想到的解決方案目前就只有Y了,請問您會怎麼解決這個問題?
八、S.A.R.法則
九、面談原則
聲音適中、口齒清楚、面帶微笑、個人形象精神,講禮貌。
主動跟面試官聊他感興趣的話題,讓面試官滿意。
主動的大膽的跟面試官聊自己熟悉有經驗的內容:項目、技術點等,做到揚長避短。
一定要表達自己非常想得到這個崗位,自己很願意學習不懂的技術。
根據自己的實際水平提出合理的待遇要求。
十、自我評價
學習能力(搞IT行業的人需要不斷的了解新的技術、工具和方法)
團隊意識(相比個人英雄主義,IT行業更倡導團隊合作)
抗壓能力(很多IT企業的工作強度相對來說還是比較大的)
㈡ PDF多頁文檔怎麼列印
軟體名稱:
5D
ToPDF虛擬列印機(製作PDF軟體)
軟體大小:
5.47MB
軟體語言:
英文
軟體類別:
破解軟體/國外軟體/應用其他
下載地址:
http://www.uzzf.com/soft/93.html
軟體介紹:
5D
PDF
Creator1.52虛擬列印機,使所有可以列印的文件均可轉換為pdf格式的文件Password:ArthurCastillouse
any
name
company
and
registration
numberSERIAL:
A01010W15CC5Cd安裝後,打開「列印機和傳真」可以...
㈢ 誰有美國鄉村音樂的吉他譜跪求!
4個精彩的鄉村電吉他樂句(講解+譜例+音頻)
http://www.byguitar.com/bbs/viewthread.php?tid=6130&highlight=%CF%E7%B4%E5
指彈吉他譜《鄉村路帶我回家》
http://www.byguitar.com/bbs/viewthread.php?tid=4099&highlight=%CF%E7%B4%E5
《鄉村搖滾連復段集錦》(PDF電子書+示範音頻)
http://www.byguitar.com/bbs/viewthread.php?tid=3976&highlight=%CF%E7%B4%E5
鄉村布魯斯
http://www.byguitar.com/bbs/viewthread.php?tid=9623&highlight=%CF%E7%B4%E5
㈣ 簡歷上的項目描述(JAVA)怎麼寫
想要成為合格的Java程序員或工程師到底需要具備哪些專業技能,面試者在面試之前到底需要准備哪些東西呢?本文陳列的這些內容既可以作為個人簡歷中的內容,也可以作為面試的時候跟面試官聊的東西,你可以把這些內容寫到你的簡歷中,當然更需要的是你在面試的時候向面試官展示這些專業技能。相信此文對正在尋覓Java程序員(Java工程師)職位的freshman以及希望成為中高級Java開發者的junior都會有所幫助。
專業技能
1.熟練的使用Java語言進行面向對象程序設計,有良好的編程習慣,熟悉常用的JavaAPI,包括集合框架、多線程(並發編程)、I/O(NIO)、Socket、JDBC、XML、反射等。
2.熟悉基於JSP和Servlet的JavaWeb開發,對Servlet和JSP的工作原理和生命周期有深入了解,熟練的使用JSTL和EL編寫無腳本動態頁面,有使用監聽器、過濾器等Web組件以及MVC架構模式進行JavaWeb項目開發的經驗。
3.對Spring的IoC容器和AOP原理有深入了解,熟練的運用Spring框架管理各種Web組件及其依賴關系,熟練的使用Spring進行事務、日誌、安全性等的管理,有使用SpringMVC作為表示層技術以及使用Spring提供的持久化支持進行Web項目開發的經驗,熟悉Spring對其他框架的整合。
4.熟練的使用Hibernate、MyBatis等ORM框架,熟悉Hibernate和MyBatis的核心API,對Hibernate的關聯映射、繼承映射、組件映射、緩存機制、事務管理以及性能調優等有深入的理解。
5.熟練的使用HTML、CSS和JavaScript進行Web前端開發,熟悉jQuery和Bootstrap,對Ajax技術在Web項目中的應用有深入理解,有使用前端MVC框架(AngularJS)和JavaScript模板引擎(HandleBars)進行項目開發的經驗。
6.熟悉常用的關系型資料庫產品(MySQL、Oracle),熟練的使用SQL和PL/SQL進行資料庫編程。
7.熟悉面向對象的設計原則,對GoF設計模式和企業應用架構模式有深入的了解和實際開發的相關經驗,熟練的使用UML進行面向對象的分析和設計,有TDD(測試驅動開發)和DDD(領域驅動設計)的經驗。
8.熟悉Apache、NginX、Tomcat、WildFly、Weblogic等Web伺服器和應用伺服器的使用,熟悉多種伺服器整合、集群和負載均衡的配置。
9.熟練的使用產品原型工具Axure,熟練的使用設計建模工具PowerDesigner和EnterpriseArchitect,熟練的使用Java開發環境Eclipse和IntelliJ,熟練的使用前端開發環境WebStorm,熟練的使用軟體版本控制工具SVN和Git,熟練的使用項目構建和管理工具Maven和Gradle。
說明:上面羅列的這些東西並不是每一項你都要爛熟於心,根據企業招聘的具體要求可以做相應的有針對性的准備。我個人覺得前6項應該是最低要求,是作為一個Java開發者必須要具備的專業技能
項目介紹
本系統是X委託Y開發的用於Z的系統,系統包括A、B、C、D等模塊。系統使用了Java企業級開發的開源框架E以及前端技術F。表示層運用了G架構,使用H作為視圖I作為控制器並實現了REST風格的請求;業務邏輯層運用了J模式,並通過K實現事務、日誌和安全性等功能,通過L實現緩存服務;持久層使用了M封裝CRUD操作,底層使用N實現數據存取。整個項目採用了P開發模型。
說明:上面的描述中,E通常指Spring(Java企業級開發的一站式選擇);F最有可能是jQuery庫及其插件或者是Bootstrap框架,當然如果要構建單頁應用(SPA)最佳的方案是前端MVC框架(如AngularJS)和JavaScript模板引擎(如HandleBars);G顯然是MVC(模型-視圖-控制),最有可能的實現框架是SpringMVC,除此之外還有Struts2、JSF以及Apache為JSF提供的MyFaces實現,可以使用JSP作為MVC中的V,也可使用模板引擎(如Freemarker和Velocity)來生成視圖,還可以是各種文檔或報表(如Excel和PDF等),而Servlet和自定義的控制器是MVC中的C,當然SpringMVC中提供了作為前端控制器的DispatcherServlet;J通常是事務腳本,K應該是AOP(面向切面編程)技術,L目前廣泛使用的有memcached和Redis;M的選擇方案很多,最有可能的是Hibernate和MyBatis,也可以兩種技術同時運用,但通常是將增刪改交給Hibernate來處理,而復雜的查詢則由MyBatis完成,此外TopLink、jOOQ也是優秀的持久層解決方案;底層的數據存取傳統上是使用關系型資料庫,可以是MySQL、Oracle、SQLServer、DB2等,隨著大數據時代的來臨,也可以採用NoSQL(如MongoDB、MemBase、BigTable等)和其他大數據存取方案(如GFS、HDFS等);項目的開發模型P可以是瀑布模型、快速原型模型、增量模型、螺旋模型、噴泉模型、RAD模型等。
項目開發流程
1.可行性分析>>>可行性分析報告/項目開發計劃書
2.需求分析>>>需求規格說明書
1.OOAD(用例圖、時序圖、活動圖)
2.界面原型:幫助理解需求、業務層設計時推導事務腳本
3.設計>>>概要設計說明書/詳細設計說明書
1.抽取業務實體(領域對象):類圖、E-R圖(概念設計階段)
2.分層架構:確定各層的技術實現方案(具體到使用的框架、資料庫伺服器、應用伺服器等)。業務層設計:事務腳本模式(事務:用戶發送一次請求就是一個事務;腳本:一個方法或一個函數;事務腳本:把一次請求封裝為一個方法或一個函數;事務腳本模式:一個事務開始於腳本的打開,終止於腳本的關閉)。業務層涉及的對象本有三種類型:事務腳本類(封裝了業務的流程)、數據訪問對象(DAO,封裝了持久化操作)、數據傳輸對象(DTO,封裝了失血/貧血領域對象),三者之間的關系是事務腳本類組合(聚合)數據訪問對象,這二者都依賴了數據傳輸對象
3.正向工程(UML類圖生成Java代碼)和逆向工程(Java代碼生成UML類圖)
4.資料庫物理設計(ER圖轉換成表間關系圖、建庫和建表、使用工具插入測試數據)
4.編碼5.測試>>>測試報告/缺陷報告
1.單元測試:對軟體中的最小可測試單元進行檢查和驗證,在Java中是對類中的方法進行測試,可以使用JUnit工具來實施。
2.集成測試:集成測試也叫組裝測試或聯合測試。在單元測試的基礎上,將所有模塊按照設計要求組裝成為子系統進行測試。
3.系統測試:將已經確認的軟體、硬體、外設、網路等元素結合在一起,進行信息系統的各種組裝測試和確認測試,系統測試是針對整個產品系統進行的測試,目的是驗證系統是否滿足了需求規格的定義,找出與需求規格不符或與之矛盾的地方,從而提出更加完善的方案。
4.驗收測試:在軟體產品完成了單元測試、集成測試和系統測試之後,產品發布之前所進行的軟體測試活動。它是技術測試的最後一個階段,也稱為交付測試。驗收測試的目的是確保軟體准備就緒,並且可以讓最終用戶將其用於執行軟體的既定功能和任務。
5.交付和維護>>>用戶手冊/操作手冊
項目管理
版本控制:CVS/SVN/Git
自動構建:Ant/Maven/Ivy/Gradle
持續集成:Hudson/Jenkins
系統架構
負載均衡伺服器:F5、A10
應用伺服器:
HTTP伺服器:Apache、NginX(HTTP、反向代理、郵件代理伺服器)
Servlet容器:Tomcat、Resin
EJB容器:WildFly(JBossApplicationServer)、GlassFish、Weblogic、Websphere資料庫伺服器:MySQL、Oracle
第三方工具(插件)應用
圖表工具:基於jQuery的圖表插件(如jQchart、Flot、Charted等)、Chart.js、Highcharts等。
報表工具:PentahoReporting、iReport、DynamicReports等。
文檔處理:POI、iText等。
工作流引擎:jBPM、OpenWFE、Snaker、SWAMP等。
作業調度:Quartz、JobServer、Oddjob等。
緩存服務:EhCache、memcached、SwarmCache等。
消息隊列:Open-MQ、ZeroMQ等。
安全框架:Shiro、PicketBox等。
搜索引擎:IndexTank、Lucene、ElasticSearch等。
Ajax框架:jQuery、ExtJS、DWR等。
UI插件:EasyUI、MiniUI等。
富文本框:UEditor、CKEditor等。
面試提問
項目是為哪個公司開發的?
項目的投入是多少?
有多少人參與了項目開發?
整個團隊中,測試人員、開發人員、項目經理比例是多少?
項目開發了多長時間?
項目總的代碼量有多少?
你的代碼量有多少?
項目採用了怎樣的開發模型或開發流程?
項目的架構是怎樣的?
項目的技術選型是怎樣的?
你在項目中承擔了怎樣的職責?
是否經常開會或加班?
項目完成後有哪些收獲或是經驗教訓?
項目中最困難的部分是什麼?
如何解決團隊開發時遇到的各種沖突?
明:對於沒有實際項目經驗的,可以在前程無憂、智聯招聘、拉勾網等網站上搜索招聘Java程序員的公司,找到他們的官方網站了解他們做的項目,查看項目的詳細介紹,然後嘗試完成其中一部分功能,最好請教一下高人看看自己的設計和代碼是否恰當,這樣相當於積累了一定的項目經驗。
面試時可以反問面試官的問題
我注意到你們使用了X技術,請問你們是如何解決Y問題的?
為什麼你們的產品使用了X技術而不是Y技術?據我所知,X技術雖然有A、B、C等好處,但也存在D和E問題,而Y技術可以解決D和E問題。
我對您說的X技術不是太熟悉,但我感覺它是一個不錯的解決方案,您能多講講它的工作原理嗎?
你們團隊是如何進行項目規劃的?一周會有幾次例會?每周的代碼量大概是多少?
就X問題我能想到的解決方案目前就只有Y了,請問您會怎麼解決這個問題?
錄用談判
要理直氣壯的提出具體的待遇要求
開出比預期稍高的價碼
不要只盯著薪水(很多公司更願意就薪水之外的條件做出讓步)
使用最合適的方法(可以嘗試在電話或E-mail中談判待遇)
自我評價
學習能力(搞IT行業的人需要不斷的了解新的技術、工具和方法)
團隊意識(相比個人英雄主義,IT行業更倡導團隊合作)
抗壓能力(很多IT企業的工作強度相對來說還是比較大的)
自學編程,免費獲取精品IT教程以及資料,搜索:黑馬程序員
網頁鏈接
㈤ 如何運用Java組件itext生成pdf
Controller層(param為數據)
byte[]bytes=PdfUtils.createPdf(param);
ByteArrayInputStreaminStream=newByteArrayInputStream(bytes);
//設置輸出的格式
response.setContentType("bin");
response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(itemName+"(評審意見).pdf","UTF-8"));
//循環取出流中的數據
byte[]b=newbyte[2048];
intlen;
while((len=inStream.read(b))>0)
response.getOutputStream().write(b,0,len);
inStream.close();
Service層(param為數據)
public static byte[] createPdf(Map<String,Object> param) {
byte[] result= null;
ByteArrayOutputStream baos = null;
//支流程評審信息匯總
List<CmplncBranchRvwInfoDTO> branchRvwInfos = (List<CmplncBranchRvwInfoDTO>) param.get("branchRvwInfos");
//主流程評審信息匯總
List<CmplncMainRvwInfoDTO> mainRvwInfos = (List<CmplncMainRvwInfoDTO>) param.get("mainRvwInfos");
//主評審信息
CmplncRvwFormDTO rvwFormDTO = (CmplncRvwFormDTO) param.get("rvwFormDTO");
//附件列表
List<FileInfoDTO> fileList = (List<FileInfoDTO>) param.get("fileList");
//專業公司
String legalEntityDeptDesc = (String) param.get("legalEntityDeptDesc");
String legalEntitySonDeptDesc = (String) param.get("legalEntitySonDeptDesc");
//設置頁邊距
Document doc = new Document(PageSize.A4, 20, 20, 60, 20);
try {
baos = new ByteArrayOutputStream();//構建位元組輸出流
PdfWriter writer = PdfWriter.getInstance(doc,baos);
//頁眉頁腳字體
BaseFont bf = null;
BaseFont bFont = null;
try {
bFont = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);
bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
} catch (Exception e) {
e.printStackTrace();
}
Font footerFont = new Font(bFont, 10, Font.NORMAL);
Font title = new Font(bf,15,Font.BOLD);
Font content = new Font(bf,9,Font.NORMAL);
Font chinese = new Font(bf, 10, Font.BOLD);
/**
* HeaderFooter的第2個參數為非false時代表列印頁碼
* 頁眉頁腳中也可以加入圖片,並非只能是文字
*/
HeaderFooter header=new HeaderFooter(new Phrase("法律合規評審系統",title),false);
//設置是否有邊框等
header.setBorder(Rectangle.NO_BORDER);
header.setAlignment(1);
doc.setHeader(header);
HeaderFooter footer=new HeaderFooter(new Phrase("-",footerFont),new Phrase("-",footerFont));
/**
* 0左 1中 2右
*/
footer.setAlignment(1);
footer.setBorder(Rectangle.NO_BORDER);
doc.setFooter(footer);
doc.open();
//doc.add(new Paragraph("評審意見:",chinese));
//7列
PdfPTable table = new PdfPTable(7);
PdfPCell cell;
table.addCell(new Paragraph("評審項目編號",chinese));
table.addCell(new Paragraph(rvwFormDTO.getRvwItemCode(),content));
cell = new PdfPCell(new Paragraph("評審項目類型",chinese));
cell.setColspan(2);
table.addCell(cell);
String rvwItemParentType = (String) param.get("rvwItemParentType");
String rvwItemType = (String) param.get("rvwItemType");
String rvwItemTwoType = (String) param.get("rvwItemTwoType");
cell = new PdfPCell(new Paragraph(rvwItemParentType+"/"+rvwItemType+"/"+rvwItemTwoType,content));
cell.setColspan(3);
table.addCell(cell);
table.addCell(new Paragraph("申請人姓名",chinese));
table.addCell(new Paragraph(rvwFormDTO.getApplicantName(),content));
cell = new PdfPCell(new Paragraph("申請人所在部門",chinese));
cell.setColspan(2);
table.addCell(cell);
cell = new PdfPCell(new Paragraph(rvwFormDTO.getAplcntDeptName(),content));
cell.setColspan(3);
table.addCell(cell);
table.addCell(new Paragraph("錄入人姓名",chinese));
table.addCell(new Paragraph(rvwFormDTO.getRecordName(),content));
cell = new PdfPCell(new Paragraph("項目涉及金額",chinese));
cell.setColspan(2);
table.addCell(cell);
table.addCell(new Paragraph(String.valueOf(rvwFormDTO.getInvolveAmount()==null?0:rvwFormDTO.getInvolveAmount()),content));
table.addCell(new Paragraph("幣種",chinese));
String involveAmountType = (String) param.get("involveAmountType");
table.addCell(new Paragraph(involveAmountType,content));
table.addCell(new Paragraph("專業公司",chinese));
cell = new PdfPCell(new Paragraph(legalEntityDeptDesc+"->"+legalEntitySonDeptDesc,content));
cell.setColspan(6);
table.addCell(cell);
table.addCell(new Paragraph("項目名稱",chinese));
cell = new PdfPCell(new Paragraph(rvwFormDTO.getItemName(),content));
cell.setColspan(6);
table.addCell(cell);
table.addCell(new Paragraph("項目概述",chinese));
cell = new PdfPCell(new Paragraph(rvwFormDTO.getItemOverview(),content));
cell.setColspan(6);
table.addCell(cell);
table.addCell(new Paragraph("評審需求",chinese));
cell = new PdfPCell(new Paragraph(rvwFormDTO.getRvwDemand(),content));
cell.setColspan(6);
table.addCell(cell);
table.addCell(new Paragraph("申請人自我評估",chinese));
cell = new PdfPCell(new Paragraph(rvwFormDTO.getApplicantSelfAssmnt(),content));
cell.setColspan(6);
table.addCell(cell);
/* table.addCell(new Paragraph("同步抄送",chinese));
cell = new PdfPCell(new Paragraph(rvwFormDTO.getSyncsenderNames(),content));
cell.setColspan(6);
table.addCell(cell);*/
int infoNum = 0;
if(fileList.size() > 0){
//附件信息
cell = new PdfPCell(new Paragraph("附件信息",chinese));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
cell.setRowspan(fileList.size()+1);
table.addCell(cell);
//序號
cell = new PdfPCell(new Paragraph("序號",chinese));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
//附件名稱
cell = new PdfPCell(new Paragraph("附件名稱",chinese));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
//上傳時間
cell = new PdfPCell(new Paragraph("上傳時間",chinese));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
//上傳人
cell = new PdfPCell(new Paragraph("上傳人",chinese));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
//附件類型
cell = new PdfPCell(new Paragraph("附件類型",chinese));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
//法律合規評審
cell = new PdfPCell(new Paragraph("法律合規評審",chinese));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
for (FileInfoDTO file : fileList) {
infoNum++;
//序號
cell = new PdfPCell(new Paragraph(infoNum+"",content));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
//附件名稱
cell = new PdfPCell(new Paragraph(file.getFileName(),content));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
//上傳時間
cell = new PdfPCell(new Paragraph(file.getUploadTimeFormat(),content));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
//上傳人
cell = new PdfPCell(new Paragraph(file.getUploadName(),content));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
//附件類型
String fileType;
if("1".equals(file.getFileType())){
fileType = "合同文件";
}else if("99".equals(file.getFileType())){
fileType = "支持文檔";
}else{
fileType = "";
}
cell = new PdfPCell(new Paragraph(fileType,content));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
//法律合規評審
String typeRvwStatus;
if("1".equals(file.getTypeRvwStatus())){
typeRvwStatus = "經審查附件無重大法律合規問題";
}else if("2".equals(file.getTypeRvwStatus())){
typeRvwStatus = "退回修改";
}else{
typeRvwStatus = "";
}
cell = new PdfPCell(new Paragraph(typeRvwStatus,content));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
}
}else{
//附件信息
cell = new PdfPCell(new Paragraph("附件信息",chinese));
table.addCell(cell);
cell = new PdfPCell(new Paragraph("沒有附件",content));
cell.setColspan(6);
table.addCell(cell);
}
cell = new PdfPCell(new Paragraph("評審意見",chinese));
cell.setRowspan(mainRvwInfos.size()+branchRvwInfos.size());
//居中
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
if(mainRvwInfos.size()>0){
cell = new PdfPCell(new Paragraph("主評審意見",chinese));
cell.setRowspan(mainRvwInfos.size());
//居中
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
infoNum = 0;
for (CmplncMainRvwInfoDTO dto : mainRvwInfos) {
infoNum++;
//序號
cell = new PdfPCell(new Paragraph(infoNum+"",content));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
//評審意見
PdfPTable branchRvwInfosTable = new PdfPTable(1);
cell = new PdfPCell(new Paragraph(delHTMLTag(dto.getRvwOpinion()),content));
cell.disableBorderSide(2);
branchRvwInfosTable.addCell(cell);
//評審人和評審時間
cell = new PdfPCell(new Paragraph(dto.getRvwUmName()+"/"+getStringDate(dto.getRvwTime()),content));
cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
cell.disableBorderSide(1);
cell.setPaddingTop(5);
branchRvwInfosTable.addCell(cell);
PdfPCell branchRvwInfosCell = new PdfPCell(branchRvwInfosTable);
branchRvwInfosCell.setColspan(4);
table.addCell(branchRvwInfosCell);
}
doc.add(table);
}
if(branchRvwInfos.size()>0){
cell = new PdfPCell(new Paragraph("支評審意見",chinese));
cell.setRowspan(branchRvwInfos.size());
//居中
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
infoNum = 0;
for (CmplncBranchRvwInfoDTO dto : branchRvwInfos) {
infoNum++;
//序號
cell = new PdfPCell(new Paragraph(infoNum+"",content));
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER); //水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中
table.addCell(cell);
//評審意見
PdfPTable branchRvwInfosTable = new PdfPTable(1);
cell = new PdfPCell(new Paragraph(delHTMLTag(dto.getRvwOpinion()),content));
cell.disableBorderSide(2);
branchRvwInfosTable.addCell(cell);
//評審人和評審時間
cell = new PdfPCell(new Paragraph(dto.getRvwUmName()+"/"+getStringDate(dto.getRvwTime()),content));
cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
cell.disableBorderSide(1);//隱藏上邊框
cell.setPaddingTop(5);
branchRvwInfosTable.addCell(cell);
PdfPCell branchRvwInfosCell = new PdfPCell(branchRvwInfosTable);
branchRvwInfosCell.setColspan(4);
table.addCell(branchRvwInfosCell);
}
doc.add(table);
}
if(doc != null){
doc.close();
}
result =baos.toByteArray();
} catch (DocumentException e) {
e.printStackTrace();
}finally{
if(baos != null){
try {
baos.close();
} catch (IOException e) {
log.error("PDF異常", e);
}
}
}
return result;
}
工具
/**
* 去掉HTML標簽
* @param htmlStr
* @return
*/
public static String delHTMLTag(String htmlStr){
if (htmlStr!=null){
String regEx_script="<script[^>]*?>[\s\S]*?<\/script>"; //定義script的正則表達式
String regEx_style="<style[^>]*?>[\s\S]*?<\/style>"; //定義style的正則表達式
String regEx_html="<[^>]+>"; //定義HTML標簽的正則表達式
Pattern p_script=Pattern.compile(regEx_script,Pattern.CASE_INSENSITIVE);
Matcher m_script=p_script.matcher(htmlStr);
htmlStr=m_script.replaceAll(""); //過濾script標簽
Pattern p_style=Pattern.compile(regEx_style,Pattern.CASE_INSENSITIVE);
Matcher m_style=p_style.matcher(htmlStr);
htmlStr=m_style.replaceAll(""); //過濾style標簽
Pattern p_html=Pattern.compile(regEx_html,Pattern.CASE_INSENSITIVE);
Matcher m_html=p_html.matcher(htmlStr);
htmlStr=m_html.replaceAll(""); //過濾html標簽
Pattern p_enter = Pattern.compile("\s*| | | ");
Matcher m_enter = p_enter.matcher(htmlStr);
htmlStr = m_enter.replaceAll("");
}
return htmlStr.trim().replaceAll(" ", ""); //返迴文本字元串
}
/**
* @return返回字元串格式 yyyy-MM-dd HH:mm:ss
*/
public static String getStringDate(Date date) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(date);
return dateString;
}