เมื่อวานมีความจำเป็นต้องใช้ Jasper Report เพื่อทำการออก Report แล้วจำเป็นต้องใช้ iTextPDF เพื่อทำการ Sign Certificate บึ้มมมม กลายเป็นโกโก้ครั้ช!!!!!! Report ออกไม่ได้

เรามาค่อยๆ Resolve ปัญหานี้กันครับ เราเริ่มจาก Dependency ของ library ของ Jasper Report กันก่อนครับ (ในที่นี้ ผมใช้ Jasper Report Library เวอร์ชัน 6.6.0 นะครับ)

Dependency ของ Jasper Report library ของ Java ทั้งหมด

เราจะเห็นว่ามี Dependency ของ Jasper Report Library ก็ไม่มีอะไรพิเศษ แต่สายตาผมก็ดันไปเห็นอะไรบางอย่าง

Jasper Report Library ใช้ iText ในการ Export file PDF

ตัว Jasper Report นั้น Implement ตัว Library ที่ชื่อว่า com.lowagie.itext ในการจัดการกับพวก file PDF ครับ เราเข้าไปดูกันดีกว่าว่าไอ Package นี้มันมีดีอะไร

com.lowagie.itext version 2.1.7 เป็น Library ที่ Jasper Report Library เลือกใช้

จะเห็นว่า Library ตัวนี้ Version นี้ ออกมาตั้งแต่ปี 2009 และ Dependency ตัว Bouncycastle ตัวเวอร์ชัน jdk14 มา โดยเราจะสนใจเฉพาะ Library ที่เราจำเป็นต้องใช้งานคือ bcprov-jdk14 และ bctsp-jdk14 ครับ

Library bcprov-jdk14 version 138

จะเห็นว่า Library bcprov-jdk14ออกมาตั้งแต่ปี 2008 ซึ่งนานมากๆ ซึ่งแน่นอนว่า คุณสมบัติการเข้ารหัส SHA-256 นั้นน่าจะยังไม่ถูก Implement ในช่วงนั้น

จะเห็นได้ว่ามีการ Implement SHA-256 ใน Bouncycastle ตอนปี 2013

อีกประเด็นนึงที่ยังไม่ได้พูดถึงคือ Library ที่เราใช้ในการ Sign Certificate นั่นก็คือ iText นั่นเอง

เราเลือกใช้งาน iText version 5.5.13 ซึ่งเป็นเวอร์ชันที่เราเลือกว่าใช้งานได้ ณ ตอนนี้ ซึ่งความจริงแล้ว iText ที่ตัว Jasper นำไป Implement นั้น ได้เปลี่ยน Package name ใหม่ไปเป็นที่เรียบร้อยแล้ว

ตัว iText เปลี่ยน Package name ใหม่ จาก com.lowagie.itext เป็น com.itextpdf.itextpdf

ทำให้เราไม่พบปัญหาในเรื่องของ 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 ใหม่ได้เลย

แค่นี้ก็เรียบร้อยแล้วครับ :)