C# ile SVG’den PDF’e Dönüştürme

Okuma Süresi: 1 dakika

C# ile SVG ile oluşturulan grafikleri PDF çevirmek için internette pek çok 3. parti kütüphaneler bulunmaktadır. Ancak bu kütüphanelerin çoğu ücretlidir.

Inkscape ücretsiz bir vektörel grafik yazılımıdır. Inkscape’i komut satırından çalıştırarak çeşitli işlemleri yaptırabiliyoruz. Bizde uygulamamız içerisinden Inkscape’i çalıştırarak SVG formatındaki dosyalarımızı PDF formatına çevirebiliriz.

İlk önce buraya tıklayarak Inkscape’i bilgisayarımıza indiriyoruz. Daha sonra Visual Studio üzerinde bir Windows Form projesi açalım ve projemizin ana dizinine Inkscape klasörünü kopyalayalım. Aşağıdaki şekilde formumuzu tasarlayalım.

Formu bu şekilde tasarladıktan sonra aşağıdaki şekilde kodlarımızı yazalım.

using System;
using System.Diagnostics;
using System.Windows.Forms;

namespace SVGtoPDF
{
    public partial class Form1 : Form
    {
        string SVGFile = String.Empty;
        string PDFFile = String.Empty;

        public Form1()
        {
            InitializeComponent();
        }

        private void btnSVGSec_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog dialog = new OpenFileDialog())
            {
                if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    SVGFile = dialog.FileName;
                    txtSVG.Text = SVGFile;
                }
            }
        }

        private void btnPDF_Click(object sender, EventArgs e)
        {
            using (SaveFileDialog dialog = new SaveFileDialog())
            {
                if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    PDFFile = dialog.FileName;
                    txtPDF.Text = PDFFile;
                }
            }
        }

        private void btnDonustur_Click(object sender, EventArgs e)
        {
            ProcessStartInfo processInfo = new ProcessStartInfo();
            processInfo.FileName = Environment.CurrentDirectory + "\\Inkscape\\inkscape.exe";
            processInfo.Arguments = String.Format("--without-gui --export-pdf=\"{0}\" \"{1}\"", txtPDF.Text, txtSVG.Text);
            processInfo.WindowStyle = ProcessWindowStyle.Hidden;

            Process process = Process.Start(processInfo);
            process.WaitForExit();

            MessageBox.Show("Dönüşüm tamamlanmıştır.");
        }
    }
}

Yazdığımız kodda Inkscape’i çalıştırdığımız argümanlar önemlidir. –without-gui Inkscape’in GUI modunda açılmamasını belirttik. –export-pdf parametresi ise PDF dosyanın nereye kaydedileceğini belirtir. Son parametre ise dönüştürülecek SVG dosyasını gösterir.

Uygulamanın kaynak kodlarını indirmek için tıklayınız.

T-SQL’de Case Insensitive Sorunu

Okuma Süresi: 1 dakika

Bir T-SQL Like sorgusu yazarken gönderdiğim anahtar kelimenin karşılığını sorgu sonucunda göremiyordum. Problemin nedeni ise sorgumun case sensitive (büyük-küçük harf duyarlı) uyumuna göre sorgulamasından kaynaklanmaktaydı. Örnek olarak aşağıdaki gibi bir sorgu yazmıştım:

SELECT * FROM urun WHERE urunadi LIKE '%ice%'

Normalde Ice ve ice kelimeleri içinde geçen kayıtları döndürmesi gerekirken sadece ice içeren kayıtlar sorgu sonucu olarak dönüyordu. Sorunun çözümü için sorgumun sonuna karakter setinin case insensitive versiyonunu belirtmem yeterlidir. Sorgum aşağıdaki şekilde olmuştur:

SELECT * FROM urun WHERE urunadi LIKE '%ice%' COLLATE sql_latin1_general_cp1_ci_as

Sizde sorgunun sonuna gelecek karakter setleri listelemek için aşağıdaki sorguyu kullanabilirsiniz.

SELECT * FROM fn_helpcollations() WHERE name LIKE 'Turkish%' AND name LIKE '%CI%'

CI yerine CS yazarsanız Case Sensitive (büyük-küçük harf duyarlı) karakter setlerini listelemiş olursunuz. CI ise Case Insensitive (büyük-küçük harf duyarsız) olmaktadır.

Repository Pattern

Okuma Süresi: 1 dakika

Büyük projeler geliştirirken yaşadığımız en büyük sıkıntı kod tekrarlarıdır. Özellikle iş katmanımızda veritabanına insert, update, delete yaparken birçok tekrar yapmaktayız. Repository pattern bizi bu dertten kurtarmaktadır. Bu yazımızda Entity Framework ile repository pattern’ın nasıl kullanılacağını öğreneceğiz.

İlk önce NuGet Package Manager kullanarak Entity Framework kütüphanesini projemize ekliyoruz.

Entity Framework'ü projeye ekliyoruz.

Daha sonra projemize bir interface ekliyoruz ve aşağıdaki kodları yazıyoruz.

using System;
using System.Linq;
using System.Linq.Expressions;

namespace RepositoryPattern
{
    interface IRepository<T>
    {
        void Insert(T entity);
        void Delete(T entity);
        IQueryable Search(Expression<Func<T, bool>> predicate);
        IQueryable GetAll();
        T GetById(int id);
    }
}

Bu yazdığımız interface yazacağımız repository sınıfımız için bir şablon olacaktır. Oluşturduğumuz interface T tipinde generic nesne tipi almaktadır. Projemize repository kodlarımızı yazacağımız sınıfımız ekleyelim.

using System;
using System.Data.Entity;
using System.Linq;

namespace RepositoryPattern
{
    public class Repository<T> : IRepository<T> where T : class
    {
        DbSet set;

        public Repository(DbContext context)
        {
            set = context.Set<T>();
        }

        public void Insert(T entity)
        {
            set.Add(entity);
        }

        public void Delete(T entity)
        {
            set.Remove(entity);
        }

        public IQueryable Search(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
        {
            return set.Where(predicate);
        }

        public IQueryable GetAll()
        {
            return set;
        }

        public T GetById(int id)
        {
            return set.Find(id);
        }
    }
}

Repository sınıfımızı IRepository sınıfından türettik ve interface üyelerini implement ettik. Metot gövdelerini de Entity Framework metotlarıyla yazdık. Kodumuzdaki T tipi bir entity tipi temsil etmektedir. Şimdi yazdığımız kodun nasıl kullanıldığını örnek olarak görelim.

using System;

namespace RepositoryPattern
{
 class Program
 {
 static void Main(string[] args)
 {
 Repository<Categories> categories = new Repository<Categories>(new NorthwindEntities());

foreach (Categories item in categories.GetAll())
 {
 Console.WriteLine(item.CategoryName);
 }
 }
 }
}

Kodda gördüğünüz gibi T tipi olarak NortwindEntities altında bulunan Categories tipi verilmiştir. Artık repository nesnemiz Categories tipini kullanarak çalışacaktır. Kodu derleyip çalıştırdığımızda aşağıdaki ekran görüntüsü gelecektir.