Sancılı bir süreç pdf şablonu oluşturmak. Kendi çalışma yapımı anlatmak gerekirse tüm bu pdf oluşturma işlemlerini konsol uygulaması şeklinde hazırlar tamam dedikten sonra (PdfWriter writter = PdfWriter.GetInstance(doc, output);) satırını bu şekilde değiştirir yoluma devam ederim. Çok büyük zaman kazancı oluyor. Hele ki ilk süreçlerde sürekli F5, F5, F5, F5, F5, F5……………………5F,5F aman Allah’ım işler karışmaya başladı.
Şu meretin bir programı olsaydı bizde FileMaker da çalışır gibi tık tık şık şık düzenleyebilseydik tüm formları keşke. Bizde WYSIWYG felsefesi ile biraz daha pratikleştirseydik bu işleri. Neyse fazla laf kalabalığı oldu. Esas oğlana dönelim bakalım ne yapıyor bu itextsharp.
Temelden başlamak gerekirse öncelikle kullanacağımız fontları, sayfanın boyutunu, kenar boşluklarını tanımlamak gerekir. Tek tek açıklayarak gidecek olursak. En baştan itibaren;
PdfPCell cell;
//burada hücremizi tanımladık ki göreceksiniz her yerde celller(hücreler) uçuşuyor olacak.
Paragraph paragraph;
//burada da paragrafımızı tanımladık. Paragraf özelliği taşıyan, hücrelerden bağımsız metinlerde kullanacağız.
BaseFont bf=BaseFont.CreateFont(“c:\\windows\\fonts\\arial.ttf”, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
//Sistem dizinimizdeki fontlardan arial olanı tanımladık. Hangi fontu kullanacağını bilmeli bu sistem. Bf değilse sf yapın istediğinizi yapın farklı formlar hazırlayıp sayfalarınızı renklendirin icabında.
Font font_small = new Font(bf, 10, Font.NORMAL, BaseColor.BLACK);
//Arial 8 boyutunda bir font_small değişkeni oluşturduk. Hücrelerde paragraflarda istediğiniz boyutlar için farklı font değişkenleri oluşturmanız kullanımda çok kolaylık sağlayacaktır.
Document doc = new iTextSharp.text.Document(PageSize.A4, 20, 20, 20, 20); //L,R,T,B
//Sayfamız A4 olacak ve kenar boşluklarıda belirtildiği gibi Sol,Sağ,Üst,Alt şeklinde olacak.
MemoryStream output = new MemoryStream();
PdfWriter writter = PdfWriter.GetInstance(doc, new FileStream(“file.pdf”, FileMode.Create));
//Bu 2’li olmazsa olmazımız. File.pdf adında bir dosya oluşturacak. Kaldı ki şablon bitince html sayfalarınızda kullanacaksanız PdfWriter kısmını üstte belirttiğim gibi değiştirmeniz gerekecektir (PdfWriter writter = PdfWriter.GetInstance(doc, output);).
doc.Open();
//ve sahnede dökümanımız. Açtık artık hayırlı uğurlu olsun:) Bundan sonraki işimiz ne yazarsak açılmış dökümanımıza ilmik ilmik işlemek olacak.
string path = HostingEnvironment.MapPath(@”~/content/images/logo.png”);
Image imgLogo = Image.GetInstance(path);
imgLogo.Alignment = 1;
imgLogo.ScaleToFit(100, 100);
//Anlaşıldığı üzere bu kısım da dökümanımıza resim, logo vs ekleme kısmı. Path kısmı ile yolunu yordamını belirtiyoruz. Aligment kısmı ile hizalıyoruz. (0 sol, 1 orta, 2 sağ, 3 iki yana yaslı). ScaleToFit ise resmi belirttiğimiz boyutlarda ölçülendiriyoruz.
PdfPTable table1 = new PdfPTable(6);
//6 sütündan oluşan bir tablo oluşturduk.Sütünlar önemlidir. Çünkü satır aşağıya doğru sınırlı olabileceği gibi sütunlarımız sayfa genişliğinde ve belirttiğimiz adette (6) olacak ki colspan ile hücre birleştirirken basit toplama çıkarma işlemi ile hizalama yapmada kolaylık sağlayacak.
float[] widths = new float[] { 0.5F, 1F, 1F, 1F, 1F, 1F };
//Burada da sayfamıza tanımladığımız 6 sütunun genişliğini veriyoruz. Genelde yapılan hata ise 3 hücre belirleyip genişlikte daha fazla ya da daha az değer bırakmaktır. Aman dikkat edilsin. Nitekim olmayan sütuna genişlik belirlenemez değil mi?
table1.SetWidths(widths);
//tablomuzun sütunlarına ait genişlikleri atıyoruz.
table1.TotalWidth = 500;
table1.LockedWidth = true;
// Yazmış olduğumuz genişlik değerini lockedwidth ile kilitlemezseniz eğer sayfanın başına sonuna ekleyeceğiniz paragraflarda tablo ile ortalanmasını istiyorsanız problem oluşuyor.
table1.DefaultCell.Border = 1;
//Border özelliğini 1 yaparak oluşturulan hücrelerde varsayılan olarak çerçeve oluşturmasını sağlıyoruz. 0 da ise çerçeve oluşturmuyor.
cell = new PdfPCell(new Phrase(“T.C.”, font_medium));
cell.HorizontalAlignment = 1; //Yatay hizada 1 yani orta
cell.VerticalAlignment = 1; //Dikey hizada 1 yani orta
cell.Colspan = 2; // 2.hücreye yerleştiriyor yani 1F genişliğindeki alana
cell.MinimumHeight = 10;
cell.Border = Rectangle.NO_BORDER; //Default olarak 1 yaptığımız borderın bu hücre için oluşmamasını sağlıyoruz.
table1.AddCell(cell); //Table1’e hücremizi(cell) ekliyoruz.
Dananın kuyruğu artık alt kısımda kopuyor. Çünkü yukarıda fikren oluşturduğumuz herşeyi altta yerleştiriyoruz. Alttaki sıralamaya göre hepsi peş peşe ekleniyor.
PdfPTable paragraphTable = new PdfPTable(1);
float[] widthsParagraph = new float[] { 5F };
paragraphTable.SetWidths(widthsParagraph);
paragraphTable.TotalWidth = 800;
paragraphTable.DefaultCell.Border = Rectangle.NO_BORDER;
paragraph = new Paragraph(new Paragraph(” Metin metin birşeyler metin.” + note, font_small));
paragraph.Alignment = Element.ALIGN_LEFT;
paragraphTable.AddCell(paragraph);
doc.Add(imgLogo); // Yukarıda oluşturduğumuz logo
doc.Add(table1); //table1 adındaki tablomuz
doc.Add(table2); // Burada oluşturmadığım fakat farklı tablolar ekleyebileceğinizi belirtmek için yazılmış başka bir tablo
doc.Add(paragraphTable); // Düz paragraf
doc.Add(table3); //Farklı bir tablo
doc.Add(new Phrase(“\n”)); //Bir satırlık boşluk
doc.Add(table4); //Farklı bir tablo
doc.NewPage(); // Bu ise yeni bir sayfa. NewPage den sonra üstteki tabloların sırasını devam ettirerek yeni sayfaya farklı bir düzende ekleme yapabilirsiniz. Örnek kodları ekliyorum. Aslında ucu bucağı olmayan ve ileride anlatacağım excel tablosu oluşturmaktan daha zor bir tasarım şekli. Allah kolaylık versin. Ek olarak örnek bir dilekçe tasarımı paylaşacağım. Umarım faydası dokunur. Ek kaynak isterseniz biraz da İngilizce zorlarsanız buyrun bu da son kıyağım olsun 🙂
Merhabalar itextsharp üzerinden c# from sayfasından pdf cıktı alıyorum cıktı alındığı zaman bilgi girince yazılar kayıyor yazıların kaymaısını engellemek için nasıl bir yol izliyebilirim yardımcı olurmusunuz ..
kullanıcan bilgi alıyoruz ve bilgileri pdf olarak dışarı alyıoruz örnek olarak
ürün adı miktar birim fiyat hesaplama kdv , gibi kısımları alıyorum ve bunları sıra ile yan yana yazdırıp pdf cıktı alıyorum ama kayıyor bunun yazılar sabit kalsın istiyorum
Merhabalar
Anladığım kadarıyla yapınız tablolanabilir bir durumda bende benzer sorunu ben tablo yapısı kullanarak çözmüştüm. Sınırları, sütun sayısını belirledikten sonra o sütunların içinde kalıyor. Yazıdaki “PdfPTable table1 = new PdfPTable(6);” ve “float[] widths = new float[] { 0.5F, 1F, 1F, 1F, 1F, 1F };” alanlarına dikkat edebilir misiniz? İyi çalışmalar dilerim.