.Net Core MVC Üzerinde .pdf Oluşturmak

Herkese selamlar ! Son zamanlarda özellikle de web uygulamalarının vazgeçilmez özelliği olan pdf oluşturmaya bakacağız bugün sizler ile beraber. Peki pdf tam olarak nedir ?  PDF aslında portable document formatın kısaltmasıdır yani taşınabilir belge biçimi. Platformlar arasında taşınabilir ve belge içerisinde ise resim ve metin barındırabilen aynı zamanda da yazdırılabilir bir formattır.

Web uygulamarı içerisinde ise htmlde yer alan table etiketleri ile oluşturduğumuz veri kümesini .pdf formatında kullanıcının bilgisayarına indirmesini sağlamak iyi bir hizmet haline geldi. .Net Core tarafında ise bu işimizi ciddi anlamda kolaylaştıran bir araç mevcut. Bu aracın ismi Rotativa. Rotativa açık kaynak kodlu pdf oluşturabildiğimiz bir kütüphanedir. Çoğu html etiketi bu kütüphane ile desteklendiği için oluşturma işlemi esnası sırasında kesinlikle bir sıkıntı çıkmaz.

Rotativayı github hesabı üzerinden indirip kullanabiliirz.

Yavaş yavaş uygulamamıza geçelim. Uygulamamızın amacı aslında gayet basit. Bir adet .net core mvc uygulaması  içerisinde model tarafından almış olduğumuz verileri arayüz üzerinde gösterdikten sonra eğer isterse kullanıcı pdf şeklinde bir dosya oluşturabilecek. Verilermiz ise nba takımları onların karşılığında ise rastgele puanlar atanmış olacak. İlk aşamada rotativayı uygulamamız içerisine almamız gerekmekte.Yukarıda  Rotativanın github hesabını sizler ile paylaşmıştım. Burada  yer alan sayfaya tıkladıktan sonra ise  içerisinde yer alan 4 dosyayı kendi uygulamamız içerisinde wwwroot file in altında “Rotativa” isimli bir klasör açıp içerisine yerleştiriyoruz.

Ardından ise proje üzerinde sağ tık yaptıktan sonra Manage Nuget Packages üzerinden Rotativa.AspNetCore u kuruyoruz.

Bu kurulumu da gerçekleştirdikten sonra uygulamamızda ilk kodlamaya başlayacağımız alan olan StartUp.cs den başlıyoruz.  StartUp.cs .net core uygulaması ilk çalıştığında ayağa kalkacak olan sınıfımızdır.  Burada yer alan kütüphaneler içerisine

using Rotativa.AspNetCore;

kütüphanesini ekliyoruz. Configure methodu içerisine ise

RotativaConfiguration.Setup(env);

methodunu ekliyoruz. Bu metot, yapılan isteğe karşılık verilecek cevaplara istinaden ara katman olarak çalışmakta ve öncelik olarak belli başlı işlemleri gerçekleştirmektedir. Kısacası uygulamamıza rotativayı kullanmak istediğimizi söylüyoruz ve burada işimiz bitiyor.

Uygulamamızı yavaş yavaş kodlamaya başlayabiliriz. Model klasörümüz üzerinde sağ tık yapıp bir adet LeagueRow isminde sınıf ekliyoruz gövdesini ise aşağıda ki gibi düzenliyoruz.

public class LeagueRow
    {
        public int position { get; set; }
        public string club { get; set; }
        public int numGames { get; set; }
        public int points { get; set; }

   public LeagueRow(int position, string club, int numGames, int points)
        {
            this.position = position;
            this.club = club;
            this.numGames = numGames;
            this.points = points;
        }
    }

Uygulama içerisinde kullandığımız bu sınıf aslında bir satır içerisinde hangi verilerin gösterileceği ve başlangıç degerlerini almasını sağlayan constructor method içeriyor.

Ardından LeagueTable isimli bir class daha ekliyoruz ve gövdesini aşağıda ki gibi düzenliyoruz.

public class LeagueTable
    {
        public DateTime DateCreated { get; set; }
        public int matchWeek { get; set; }

        public List<LeagueRow> rows { get; set; }

        public LeagueTable()
        {
            this.DateCreated = DateTime.Now.Date;
            this.rows = new List<LeagueRow>();
            this.matchWeek = 33;
        }
   

        public void createTableInstance()
        {
            string[] teams = { "Atlanta Hawks", "Boston Celtics", "Brooklyn Nets", "Charlotte Hornets", "Chicago Bulls", "Clevland Cavaliers", "Dallas Mavericks", "Denver Nuggets",
                               "Detroit Pistons", "Golden State Warriors", "LA Clippers", "LA Lakers", "Milwaukee Bucks", "Minnesota Timberwolves", "New Orleans Pelicans",
                                "Philadephina 76ers", "Phoenix Suns", "Toronto Raptors", "Sacremento Kings", "Orlando Magic"};

            int[] gamesPlayed = new int[] { 33, 33, 33, 34, 33, 34, 33, 34, 33, 33, 33, 34, 33, 34, 33, 34, 33, 33, 33, 34 };

            Random rnd = new Random();
            int[] accesses = Enumerable.Range(0, 20).OrderBy(c => rnd.Next()).ToArray();


            int[] points = new int[] { 82, 80, 66, 64, 63, 61, 47, 47, 46, 46, 42, 39, 38, 36, 35, 33, 33, 28, 17, 14 };


            for (int i = 0; i < gamesPlayed.Length; i++)
            {
                rows.Add(new LeagueRow(i + 1, teams[accesses[i]], gamesPlayed[accesses[i]], points[i]));
            }
        }

Class içerisinde amacımız tamamen bir tarih içerisinde takımların ve puanların rastgele gelmesini sağlayacak şekilde dizayn etmek.  Sırada ise Controller  var.

HomeController tarafında iki farklı methodumuz var bunlardan ilki LeagueTable isimli IActionResult tipinde olan methodumuz , amacımız ise gayet kolay sadece verilerimizi göstereceğimiz sayfayı içersinde verilerimiz ile beraber view tarafına taşımak.

public IActionResult LeagueTable()
        {
            LeagueTable nbaLeague = new LeagueTable();
            nbaLeague.createTableInstance();

            return View(nbaLeague);
        }

Method tamamladıktan sonra LeagueTable isminde bir view oluşturup. Gövdesini aşağıda ki gibi düzenliyoruz.

@model CoreMVCExportPDF.Models.LeagueTable
@{
    ViewData["Title"] = "LeagueTable";
    Layout = "_Layout";
}
<div class="jumbotron p-2 text-center border border-primary">
    <p class="h4">Date created: <span class="badge badge-primary">@Model.DateCreated.ToString("MM/dd/yyyy")</span></p><br />
    <p class="h4">Game Week: <span class="badge badge-primary">@Model.matchWeek</span></p>
</div>
<h1>Completed Game Schedule</h1>
<h4 class="text-muted">NBA League 2019-2020</h4>
<table class="table table-bordered">
    <thead style="background-color: #1d428a">
        <tr class="text-white">
            <th scope="col">Position</th>
            <th scope="col">Team</th>
            <th scope="col">Games Played</th>
            <th scope="col">Points</th>
        </tr>
    </thead>
    <tbody>
        @for (int i = 0; i < Model.rows.Count; i++)
        {
            <tr>
                <th scope="row">@Model.rows[i].position</th>
                <td>@Model.rows[i].club</td>
                <td>@Model.rows[i].numGames</td>
                <td>@Model.rows[i].points</td>
            </tr>
        }
    </tbody>
</table>

View tarafımızda hazır artık tek yapmamız gereken pdf alanine export etmek onuda ViewAsPdf methodu kendiliğinden yapmakta.

public IActionResult LeaguePDF()
        {
            LeagueTable nbaLeague = new LeagueTable();
            nbaLeague.createTableInstance();


            return new ViewAsPdf("LeagueTable", nbaLeague)
            {
                CustomSwitches = "--footer-center [page]"
            };
        }
public IActionResult LeaguePDF()
        {
            LeagueTable nbaLeague = new LeagueTable();
            nbaLeague.createTableInstance();


            return new ViewAsPdf("LeagueTable", nbaLeague)
            {
                CustomSwitches = "--footer-center [page]"
            };
        }

Uygulamanın arayüzü ise aşağıda ki gibi:

Core mvc üzerinde de aslında pdf oluşturmak ciddi anlamda kolay.Uygulamayi ise github hesabım üzerinden indirebilirsiniz. Yazımı okuduğunuz için teşekkür ederim. Sonra ki yazılarda görüşmek üzere hoşça kalın…

Exit mobile version