เมื่อจำเป็นต้องใช้ Jasper Report พร้อม iTextPDF แล้วต้อง Sign Certificate (SHA-256) ไฟล์ PDF ผ่าน Bouncycastle บน Java
เมื่อวานมีความจำเป็นต้องใช้ Jasper Report เพื่อทำการออก Report แล้วจำเป็นต้องใช้ iTextPDF เพื่อทำการ Sign Certificate บึ้มมมม กลายเป็นโกโก้ครั้ช!!!!!! Report ออกไม่ได้
เรามาค่อยๆ Resolve ปัญหานี้กันครับ เราเริ่มจาก Dependency ของ library ของ Jasper Report กันก่อนครับ (ในที่นี้ ผมใช้ Jasper Report Library เวอร์ชัน 6.6.0 นะครับ)
เราจะเห็นว่ามี Dependency ของ Jasper Report Library ก็ไม่มีอะไรพิเศษ แต่สายตาผมก็ดันไปเห็นอะไรบางอย่าง
ตัว Jasper Report นั้น Implement ตัว Library ที่ชื่อว่า com.lowagie.itext
ในการจัดการกับพวก file PDF ครับ เราเข้าไปดูกันดีกว่าว่าไอ Package นี้มันมีดีอะไร
จะเห็นว่า Library ตัวนี้ Version นี้ ออกมาตั้งแต่ปี 2009 และ Dependency ตัว Bouncycastle ตัวเวอร์ชัน jdk14 มา โดยเราจะสนใจเฉพาะ Library ที่เราจำเป็นต้องใช้งานคือ bcprov-jdk14
และ bctsp-jdk14
ครับ
จะเห็นว่า Library bcprov-jdk14
ออกมาตั้งแต่ปี 2008 ซึ่งนานมากๆ ซึ่งแน่นอนว่า คุณสมบัติการเข้ารหัส SHA-256 นั้นน่าจะยังไม่ถูก Implement ในช่วงนั้น
อีกประเด็นนึงที่ยังไม่ได้พูดถึงคือ Library ที่เราใช้ในการ Sign Certificate นั่นก็คือ iText นั่นเอง
เราเลือกใช้งาน iText version 5.5.13 ซึ่งเป็นเวอร์ชันที่เราเลือกว่าใช้งานได้ ณ ตอนนี้ ซึ่งความจริงแล้ว iText ที่ตัว Jasper นำไป Implement นั้น ได้เปลี่ยน Package name ใหม่ไปเป็นที่เรียบร้อยแล้ว
ทำให้เราไม่พบปัญหาในเรื่องของ Package conflict กัน สำหรับเรื่องของตัว iText PDF
กลับมาแก้ปัญหาตัว Bouncycastle กันอีกครั้งครับ ด้วยตัว Jasper ไม่มีการ Implement ในส่วนของ PDF Signature อยู่แล้ว ซึ่งเราสามารถตัด Library ตัว Bouncycastle ที่ติดมากับ Library ของ com.lowagie.itext
ได้ครับ แล้วทำการเพิ่ม Package version ใหม่เข้าไปแทนครับ
ด้วย Project ใหม่ๆที่บริษัทเรากำลังทำ ตอนนี้เราใช้ Package Management ของ Project เป็น Gradle อยู่เรา เราสามารถแทรกคำสั่งของ Gradle ในไฟล์ build.gradle เพื่อ exclude ตัว Package ได้ตามด้านล่างครับ
แล้วทำการ Add Package Bouncycastle version ใหม่เข้าไป พร้อมกับตัว iText version ใหม่ได้เลย
แค่นี้ก็เรียบร้อยแล้วครับ :)