Dokümanı PDF e Çevirme / TIF (Çoklu Sayfa) i PDF e Çevirme
Elektronik imza’nın hayatımıza iyice girmeye başlasıyla, bir standart olarak kullanılan PDF dokümanları daha bir kıymetleneceği su götürmez bir gerçektir. Bu amaçla da yaygın olan PDF kullanımı giderek artacaktır. Sizde elinizdeki dokumanları PDF e çevirme ihtiyacı hissedeceğiniz günler yakındır.
Dokümanları PDF e çeviren birçok ürün yerli ve yabancı piyasada çokça vardır. Elinizdeki dokümanın kalitesine göre bir çoğu PDF e çevirdiğinde dökümanızı optimize ederek, temizleyerek, sıkıştırarak hatta aranabilir(searchable) hale getirmektedir. Çünkü iş sadece PDF e çevirmek değildir. Kullanılabilirliğini artırmak da bu işin esaslarındadır.
Bu yazımda size elinizdeki dokümanları PDF e çeviren açık kaynak (Open Source) kodlu bir projeden bahsedeceğim. “PDFSharp” sayesinde birçok dokümanızı PDF e çevirebilirsiniz yada kendiniz PDF hazırlayabilirsiniz.
Hazır birçok kütüphanesi bulunan PDFSharp’ı http://sourceforge.net/projects/pdfsharp/files/ adresinden indirebilir, detaylı incelemeleriniz de http://www.pdfsharp.net/ sitesinden yapabilirsiniz.
Ben sizinle çoklu sayfalardan oluşan bir TIF dokümanını (yada herhangi bir resim dosyasını) PDF e çevirmenizi sağlayan hazırladığım bir fonksiyonu bu yazında paylaşacağım. Hem de çevirdiğiniz TIF dokümanın boyutunu arttırmadan.

Kaynak Kodu :
Imports System.IO
Imports ISO.IBS.Utility.Common
Imports IBS.IBSException.HataYonetimi
ImportsISO.IBS.Data.DataAccess.FileSystemAccess.TextFileLog
Imports PdfSharp.Drawing
Namespace FileSystemAccess.TifToPDF.Classes
Public Class TifToPDFDonusturucu
Implements Interfaces.ITifToPDFDonusturucu
”’
Çoklu sayfaiçeren TIF dokumanlarının tamamını PDF e ekleyen işlevdir.
”’ Tif dokümamınıntam adresi
”’ Kaydedilecek PDF dokümanın tam adresi
”’ İşlemin Başarılı/Başarısız olma sonucu
Private FunctionTifToPDFDonusturucu(ByVal TifResmininAdresi As String, ByVal KaydedilecekPDFDosyasininAdresi As String) As Boolean Implements Interfaces.ITifToPDFDonusturucu.TifToPDFDonusturucu
Dim PdfSharpXGR AsPdfSharp.Drawing.XGraphics = Nothing
Dim PdfeEklenecekResim AsPdfSharp.Drawing.XImage = Nothing
Dim arananDosya As New FileInfo(TifResmininAdresi)
Dim arananKlasorMevcutMu AsBoolean = arananDosya.Exists()
If (arananKlasorMevcutMu) Then
Dim tif AsDrawing.Image = Drawing.Image.FromFile(TifResmininAdresi) ‘Tif dokumanını alır.
Dim tifSayfalari As New Drawing.Imaging.FrameDimension(tif.FrameDimensionsList(0))
Dim sayfaSayisi AsInteger = tif.GetFrameCount(tifSayfalari)
Dim pdfDosyasi AsNew PdfSharp.Pdf.PdfDocument()
‘TIF in tüm sayfalarını PDF’e ekler.
For tifSayfasi AsInteger = 0 TosayfaSayisi – 1
tif.SelectActiveFrame(tifSayfalari, tifSayfasi) ‘TIFiçindeki sayfayı seçer
pdfDosyasi.Pages.Add(New PdfSharp.Pdf.PdfPage())‘ PDF dosyasına yeni bir sayfa ekler
PdfSharpXGR = PdfSharp.Drawing.XGraphics.FromPdfPage(pdfDosyasi.Pages(tifSayfasi))
‘Hazır kütüphane yardımıyla PDF’e yeni eklenensayfayı alır
PdfeEklenecekResim = tif ‘Tif’in eklenecekresmini alır
PdfSharpXGR.DrawImage(PdfeEklenecekResim, 0, 0) ‘PDFe alınan Tif i ekler.
Next
Dim kaydedilecekKlasorAdresi As String =KaydedilecekPDFDosyasininAdresi.Substring(0,KaydedilecekPDFDosyasininAdresi.LastIndexOf(“\”))
Dim kaydedilecekKlasor As New DirectoryInfo(kaydedilecekKlasorAdresi)
Dim klasorMevcutMu As Boolean =kaydedilecekKlasor.Exists()
If (NotklasorMevcutMu) Then
Directory.CreateDirectory(kaydedilecekKlasorAdresi)
End If
pdfDosyasi.Save(KaydedilecekPDFDosyasininAdresi) ‘PDF i kaydeder.
pdfDosyasi.Close()
Return True
Else
Throw NewException(“Arananresim bulunamadı.”)
Return False
End If
End Function
”’
Çoklu sayfa içeren TIF dokumanlarının tamamını PDF eekleyen işlevdir.
”’ Parametre olarak verilen filigran metnini herbir sayfanınortasına ekler.
”’
”’ Tif dokümamınıntam adresi
”’ Kaydedilecek PDF dokümanın tam adresi
”’ filigranMetni
”’ İşlemin Başarılı/Başarısız olma sonucu
Private FunctionTifToPDFDonusturucu(ByVal TifResmininAdresi As String, ByVal KaydedilecekPDFDosyasininAdresi As String, ByRef filigranMetni AsString) As Boolean ImplementsInterfaces.ITifToPDFDonusturucu.TifToPDFDonusturucu
Dim PdfSharpXGR AsPdfSharp.Drawing.XGraphics = Nothing
Dim PdfeEklenecekResim AsPdfSharp.Drawing.XImage = Nothing
Dim arananDosya As New FileInfo(TifResmininAdresi)
Dim arananKlasorMevcutMu AsBoolean = arananDosya.Exists()
If (arananKlasorMevcutMu) Then
Dim tif AsDrawing.Image = Drawing.Image.FromFile(TifResmininAdresi) ‘Tif dokumanını alır.
Dim tifSayfalari As New Drawing.Imaging.FrameDimension(tif.FrameDimensionsList(0))
Dim sayfaSayisi AsInteger = tif.GetFrameCount(tifSayfalari)
Dim pdfDosyasi AsNew PdfSharp.Pdf.PdfDocument()
‘TIF in tüm sayfalarını PDF’e ekler.
For tifSayfasi AsInteger = 0 TosayfaSayisi – 1
tif.SelectActiveFrame(tifSayfalari, tifSayfasi) ‘TIFiçindeki sayfayı seçer
pdfDosyasi.Pages.Add(New PdfSharp.Pdf.PdfPage()) ‘ PDF dosyasınayeni bir sayfa ekler
Dim pdfSayfasi AsPdfSharp.Pdf.PdfPage =pdfDosyasi.Pages(tifSayfasi)
PdfSharpXGR = PdfSharp.Drawing.XGraphics.FromPdfPage(pdfSayfasi)
‘Hazır kütüphane yardımıyla PDF’e yeni eklenensayfayı alır
PdfeEklenecekResim = tif ‘Tif’in eklenecekresmini alır
PdfSharpXGR.DrawImage(PdfeEklenecekResim, 0, 0) ‘PDFe alınan Tif i ekler.
Dim yaziSecenekleri As NewPdfSharp.Drawing.XPdfFontOptions(PdfSharp.Pdf.PdfFontEncoding.Unicode)
‘filigran EKLEME
Dim font AsNew XFont(“Arial”, 44, XFontStyle.Bold,yaziSecenekleri)
Dim filigraninBoyutu As XSize =PdfSharpXGR.MeasureString(filigranMetni, font)
PdfSharpXGR.TranslateTransform(pdfSayfasi.Width.Point()/ 2, pdfSayfasi.Height.Point() / 2)
PdfSharpXGR.RotateTransform(-Math.Atan(pdfSayfasi.Height.Point()/ pdfSayfasi.Width.Point()) * 180 / Math.PI)
PdfSharpXGR.TranslateTransform(-pdfSayfasi.Width.Point() / 2,-pdfSayfasi.Height.Point() / 2)
Dim filigraninGorunumBicimi As New XStringFormat()
filigraninGorunumBicimi.Alignment = XStringAlignment.Near
filigraninGorunumBicimi.LineAlignment = XLineAlignment.Near
Dim filigranFircasi As XBrush = New XSolidBrush(XColor.FromKnownColor(XKnownColor.Red))
Dim ortaNoktaX AsDouble = (pdfSayfasi.Width.Point() -filigraninBoyutu.Width) / 2 + 30
Dim ortaNoktaY AsDouble = (pdfSayfasi.Height.Point() -filigraninBoyutu.Height) / 2
Dim ortaNokta AsXPoint = NewXPoint(ortaNoktaX, ortaNoktaY)
Dim kalem AsNew XPen(XColor.FromKnownColor(XKnownColor.Red),4)
‘ Draw the string
PdfSharpXGR.DrawRectangle(kalem, ortaNoktaX, ortaNoktaY,filigraninBoyutu.Width, filigraninBoyutu.Height)
PdfSharpXGR.DrawString(filigranMetni,font, filigranFircasi, ortaNokta, filigraninGorunumBicimi)
‘filigran EKLEME SON
Next
Dim kaydedilecekKlasorAdresi As String =KaydedilecekPDFDosyasininAdresi.Substring(0,KaydedilecekPDFDosyasininAdresi.LastIndexOf(“\”))
Dim kaydedilecekKlasor As New DirectoryInfo(kaydedilecekKlasorAdresi)
Dim klasorMevcutMu As Boolean =kaydedilecekKlasor.Exists()
If (NotklasorMevcutMu) Then
Directory.CreateDirectory(kaydedilecekKlasorAdresi)
End If
pdfDosyasi.Save(KaydedilecekPDFDosyasininAdresi) ‘PDF i kaydeder.
pdfDosyasi.Close()
Return True
Else
Throw NewException(“Arananresim bulunamadı.”)
Return False
End If
End Function
End Class
End Namespace
PdfSharp ile PDF e Filigran (Watermark) Ekleme
Önceki yazılarımda, sizi .net ile geliştirilmiş hazır bir kütüphane olan PdfSharp ile tanıştırmıştım. Bu yazımda oluşturduğunuz pdf’lerinize filigran(watermark) eklemeyi size göstereceğim. PdfSharp ile bu oldukça basit bir şekilde gerçekleştirilebilmektedir.
Örnek kodlar aşağıdaki gibidir.
Dim yaziSecenekleri As New PdfSharp.Drawing.XPdfFontOptions(PdfSharp.Pdf.PdfFontEncoding.Unicode)
‘filigran EKLEME
Dim font As New XFont(“Arial”, 44, XFontStyle.Bold,yaziSecenekleri)
Dim filigraninBoyutu As XSize = PdfSharpXGR.MeasureString(filigranMetni,font)
PdfSharpXGR.TranslateTransform(pdfSayfasi.Width.Point()/ 2, pdfSayfasi.Height.Point() / 2)
PdfSharpXGR.RotateTransform(-Math.Atan(pdfSayfasi.Height.Point() /pdfSayfasi.Width.Point()) * 180 / Math.PI)
PdfSharpXGR.TranslateTransform(-pdfSayfasi.Width.Point()/ 2, -pdfSayfasi.Height.Point() / 2)
Dim filigraninGorunumBicimi AsNew XStringFormat()
filigraninGorunumBicimi.Alignment = XStringAlignment.Near
filigraninGorunumBicimi.LineAlignment = XLineAlignment.Near
Dim filigranFircasi As XBrush = New XSolidBrush(XColor.FromKnownColor(XKnownColor.Red))
Dim ortaNoktaX As Double = (pdfSayfasi.Width.Point() -filigraninBoyutu.Width) / 2 + 30
Dim ortaNoktaY As Double = (pdfSayfasi.Height.Point() -filigraninBoyutu.Height) / 2
Dim ortaNokta As XPoint = New XPoint(ortaNoktaX, ortaNoktaY)
Dim kalem As New XPen(XColor.FromKnownColor(XKnownColor.Red),4)
‘ Draw the string
PdfSharpXGR.DrawRectangle(kalem, ortaNoktaX,ortaNoktaY, filigraninBoyutu.Width, filigraninBoyutu.Height)
PdfSharpXGR.DrawString(filigranMetni, font,filigranFircasi, ortaNokta, filigraninGorunumBicimi)
‘filigran EKLEME SON
Eklenen filigran Adobe Acrobat Reader kullanılarak kaldırılabiliyor mu?
Filigran ayrı bir katman (layer) olarak eklenmesine rağmen, Acrobat Reader ya da Writer ile kaldırılamıyor. Bu da oluştumuş olduğunuz pdf'in üzerindeki filigranın kalıcı hale gelmesini sağlıyor.
(Not :Yukarıdaki iki yazıdan da anlayacağınız üzere, tiff formatındaki belgeleri pdf çevirip, üzerlerine hiç bir şekilde kaldırılamayan bir filigran ekleme ihtiyacına cevap olmasını için böyle bir uygulamaya gitmiştik.)
Mehmet Bey,
PDF oluşturmak için kullanabileceğimiz başka kütüphanelerde var mı?