Merhaba arkadaşlar bugün sizlere daha öncede bahsettiğim bir konu için daha farklı bir çözüm yolu ile kullanmayı bahsedeceğim. Daha önceki SharePoint WebPart ile Html Formatındaki Yazıyı PDF Formatına Dönüştürerek Kaydetmek adlı makale yazımda oluşturulan pdf dosyalarını sunucu üzerinde bir dosya konumuna nasıl kaydedeceğimizden bahsetmiştim.
Bu yazımda ise farklı bir yöntem ile html formatını pdf dosya formatına çevirerek tarayıcı üzerinden son kullanıcının indirmesini sağlayacağız.
İlk olarak bir projemize “TuesPechkin.dll” ve “TuesPechkin.Wkhtmltox.Win64.dll” isimli iki dll dosyalarımızı referans olarak projemize ekliyoruz.
NOT: Dll dosyalarını makalenin en altında yer alan github linkindeki projede “DLL” klasöründen alabilirsiniz.
Daha sonra projemize “Pdf.cs” adında bir class ekliyoruz. Bu projeye aşağıdaki iki referansı eklememiz gerekmektedir.
1 2 |
using System.Drawing.Printing; using TuesPechkin; |
Bu referansları ekledikten sonra dosyamız içindeki “Pdf” classının içine aşağıdaki kodu ekliyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
private static ThreadSafeConverter _converter; private static readonly IToolset toolset = new PdfToolset(new Win64EmbeddedDeployment(new TempFolderDeployment())); private static ThreadSafeConverter Converter { get { if (_converter == null) { _converter = new ThreadSafeConverter(toolset); } return _converter; } } public static byte[] ConvertToPdf(string @html) { ObjectSettings settings = new ObjectSettings { HtmlText = @html, WebSettings = new WebSettings { DefaultEncoding = "UTF-8", LoadImages = true, PrintBackground = true, EnableJavascript = true, EnableIntelligentShrinking = false, } }; HtmlToPdfDocument document = new HtmlToPdfDocument() { GlobalSettings = { PaperSize = PaperKind.A4, Orientation = GlobalSettings.PaperOrientation.Portrait, UseCompression=true, Margins = { Unit = Unit.Centimeters, All=0 }, }, Objects = { settings } }; return Converter.Convert(document); } |
Daha sonra projemize bir webpart ekliyoruz. Ben önceki yazımda gibi sayfa adını html bilgisini kullanıcıdan alacak şekilde ascx koduna aşağıdaki html kodlarını ekliyorum.
1 2 3 |
Save File Name : <asp:TextBox ID="tbFileName" runat="server"></asp:TextBox> <br /> Html Content : <asp:TextBox ID="tbPdfContent" runat="server" TextMode="MultiLine" Rows="6"></asp:TextBox> <br /> <asp:Button ID="btnSave" runat="server" Text="Save" OnClick="btnSave_Click" /> |
Code behind tarafına geldiğimiz zaman “Save” butonuna tıklandığı zaman işlemimizi yaptıracağımız için buton click event içine kodlarımızı yazıyoruz. Son kullanıcı tarafında herhangi bir hataya denk gelmemek için bu kodlarıda aşağıdaki gibi “SPSecurity.RunWithElevatedPrivileges” içinde yazacağız.
1 2 3 4 |
SPSecurity.RunWithElevatedPrivileges(delegate () { }); |
Bu kısımda ise ilk olarak dosya adımızı ve html bilgilerimizi alalım.
1 2 |
string fileName = tbFileName.Text; string html = tbPdfContent.Text; |
Daha sonra aldığımız html bilgisini eklediğimiz “Pdf” classının “ConvertToPdf” methodunu kullanarak byte arraya dönüştürüyoruz.
1 |
byte[] data = Pdf.ConvertToPdf(html); |
Oluşan verimizi “HttpResponse” üzerinden pdf formatı olarak indirmemiz gerekecek.
İlk olarak response umuzun content type tipini belirtiyoruz. Pdf formatı olduğu için “application/pdf” olarak tanımlamamız gerekecek.
1 |
Response.ContentType = "application/pdf"; |
Daha sonra bu response için header bilgisi girmemiz gerekecek ve burada ise header name olarak “Content-Disposition” value olarak ise “attachment; filename=filename.pdf” olarak setlememiz gerekecektir. Burada dosya ismini kullanıcıdan aldığımız için “filename.pdf” kısmını dinamik olacak şekilde güncellememiz gerekecektir.
1 |
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName + ".pdf"); |
Bu işlemden sonra da bufferoutput değişkenimizi false olarak ayarlamamız gerekmektedir.
1 |
Response.BufferOutput = false; |
Bütün bu ayarlamaları tamamladıktan sonra son olarak outputstream ile datamızı yazdırıp response işlemimizi sonlandırabiliriz.
1 2 |
Response.OutputStream.Write(data, 0, data.Length); Response.End(); |
Tüm bu işlemlerden sonra kodumuz tamamlanmış olacaktır. Tüm bu buton event içindeki kodları tek bir şekilde görecek olursak aşağıdaki gibi olacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SPSecurity.RunWithElevatedPrivileges(delegate () { string fileName = tbFileName.Text; string html = tbPdfContent.Text; byte[] data = Pdf.ConvertToPdf(html); Response.ContentType = "application/pdf"; Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName + ".pdf"); Response.BufferOutput = false; Response.OutputStream.Write(data, 0, data.Length); Response.End(); }); |
Kodumuzu tamamladıktan sonra projemizi deploy ediyoruz ve sayfamıza webpartımızı ekliyoruz.
Gerekli bilgileri doldurup “Save” butonuna basarak dosyamıız indiriyoruz.
Bu işlemden sonra eğer bir engelleme yoksa tarayıcımız tarafında verdiğimiz html ile oluşturulan bir pdf dosyası inecektir.
Yukarıdaki gördüğünüz gibi dosya indirme işlemini başarılı bir şekilde tamamladık.
Pdf dosyamızı açtığımızda html içeriğimiz bire bir geldiğini görüyoruz.
Proje dosyasını aşağıdaki github adresinden indirebilirsiniz.
İlk Yorumu Siz Yapın