วันพุธที่ ๘ กรกฎาคม พ.ศ. ๒๕๕๒

เขียนโปรแกรมจัดการเอกสาร pdf ด้วย iTextSharp

เมื่อไม่นานไม่นี้ผมได้รับ requirement ให้โปรแกรมที่พัฒนาขึ้นสามารถค้นหาและแสดงเอกสาร pdf โดยมีฟังก์ชันพิเศษ นั่นคือให้สามารถตัดหน้าบางหน้าของเอกสาร pdf ออก สำหรับ user บางกลุ่ม เช่นตัดหน้าสุดท้ายออก ถ้า user เป็นพนักงานของแผนก xxx ทำให้ผมต้องไปพึ่งบริการของ google ซึ่งพบว่ามี free .net-Pdf library ตัวหนึ่งน่าสนใจมากนั่นคือ iTextSharp ครับ

หลังจาก download มาลงที่เครื่องเรียบร้อยก็ลองทดสอบกันเลย เริ่มจาก Add Reference ใน ASP.net โปรเจคก่อน และทำการ Import Namespace ให้เรียบร้อย ขั้นตอนการทำงานก็คือ ผมสร้าง Web Form ขึ้นมาโดยให้รับค่า Location ของ pdf file ที่จะทำการเปิดให้ user ผ่าน QueryString จากนั้นก็ไปตรวจสอบสิทธิ์ของ user ว่าจะให้ซ่อนหน้าไหนบ้าง แล้วจึงใช้ iTextSharp.PdfCopy ทำการสร้างเอกสาร pdf ขึ้นมาใหม่ และ copy หน้าที่ user มีสิทธิเห็นไปใส่ในเอกสารใหม่ลองดูโค้ดกันครับ


Public intIgnorePages As List(Of Integer)

Protected Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles frmMain.Load

Dim strLocation As String = Server.UrlDecode(Request("Location"))
Dim fileName As String = "OUTPUT/" & _userCredential.EmployeeID & "/" & fileInfo.Name
Dim reader As New PdfReader(strLocation)
Dim document As New iTextSharp.text.Document(reader.GetPageSizeWithRotation(1))
Dim fs As New FileStream(Server.MapPath(fileName), FileMode.Create)
Dim page As PdfImportedPage = Nothing
Dim copy As New PdfCopy(document, fs)

If File.Exists(fileName) Then File.Delete(fileName)
intIgnorePages = ValidateUserPermission
document.Open()
For i As Integer = 1 To reader.NumberOfPages
Dim ipage As Integer = i
If intIgnorePages Is Nothing OrElse intIgnorePages.Find(Function(c) c = ipage) = 0 Then
copy.AddPage(copy.GetImportedPage(reader, ipage))
End If
Next
document.Close()
reader.Close()
copy.Close()
fs.Close()
fs.Dispose()
Response.Redirect(fileName)

End Sub


สำหรับโค้ดด้านบนเป็นโค้ดที่ผมใช้ทดสอบโปรแกรมยังไม่ใช่โค้ดที่ใช้งานจริง แต่สำหรับผลลัพธ์เป็นที่น่าพอใจมาก สุดยอดจริงๆครับ

Reference:
iTextSharpby blowagie, geraldhenson, psoares33

๓ ความคิดเห็น:

Unknown กล่าวว่า...

รบกวนอธิบายการทำงานแต่ละบรรทัดหน่อยได้ไม๊อ่ะคะ
พอดีจะใช้งานเหมือนกันอ่ะคะ
แต่ดู Code แล้วงง ๆ อยู่เลย
เผื่อจะได้นำไปใช้งานได้ถูกนะคะ
ขอบคุณคะ ^^

arareh กล่าวว่า...

ตามมาจากบอร์ด GreatFriends เดี๋ยวจะลองนำไปปรับใช้ดูนะค่ะ ขอบคุณค่ะ แต่ยังงงๆอยู่บ้าง

jnithi กล่าวว่า...

ลองดูบทความใหม่เกี่ยวกับ iTextSharp ครับ ผมใส่ comment ไว้ด้วย

http://jnithi.blogspot.com/2009/10/aspnet-crystal-report-2-pdf-itexsharp.html