Sunday, January 24, 2016

Creating PDF files programmatically in Windows Runtime Apps





Hello everyone ! In this post I'm gonna show, how we can programmatically generate PDF files in our WinRT applications. This a typical requirement in applications like Shopping App, Inventory Management, Banking System etc.. where we may want to generate an invoice for our customers or generate a pdf to show a mini-statement in any banking or finance app and print it.

iTextSharp to the rescue !
iText is a PDF library that allows you to CREATE, ADAPT, INSPECT and MAINTAIN documents in the Portable Document Format (PDF)
Generate documents and reports based on data from an XML file or a database.
I've found a lot of stuff which demonstrates the use of iTextSharp in ASP.NET applications but very few on the modern WinRT apps.
Hence, I decided to make one of my own and provide some help to you fellow developers.

Enough said ! Let's directly dive into the code and see a working sample.

1. Install iTextSharp library for Nuget Packages.


2. Next, I create a method to generate a random string to a give a name to the StorageFile object and avoid collisions on every create.

public string RandomString(int length)
        {
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            var random = new Random();
            return new string(Enumerable.Repeat(chars, length)
              .Select(s => s[random.Next(s.Length)]).ToArray()) + ".pdf";
        }
3. Create methods for formatting the text that is going to be added to the tableview.

private static void AddCellToHeader(PdfPTable tableLayout, string cellText)
        {
            tableLayout.AddCell(new PdfPCell(new Phrase(cellText, new Font(Font.FontFamily.TIMES_ROMAN, 10,1, iTextSharp.text.BaseColor.BLACK))) 
                               { HorizontalAlignment = Element.ALIGN_CENTER, 
                                 Padding = 5, 
                                 BackgroundColor = new BaseColor(255, 255, 255) 
                               });
        }

private static void AddCellToBody(PdfPTable tableLayout, string cellText)
        {
            tableLayout.AddCell(new PdfPCell(new Phrase(cellText, new Font(Font.FontFamily.TIMES_ROMAN, 10, 1, iTextSharp.text.BaseColor.BLACK)))
            {
                HorizontalAlignment = Element.ALIGN_CENTER,
                Padding = 5,
                BackgroundColor = new BaseColor(255, 255, 255)
            });
        }

4.Add the following code to generate the pdf file.(In this sample I've demonstrated an example of Mini Statement used in a banking app.)

protected  override async void OnNavigatedTo(NavigationEventArgs e)
        {
            try
            {
                string path = RandomString(5);
                var storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
                var file = await storageFolder.CreateFileAsync(path, CreationCollisionOption.ReplaceExisting);
                if (file != null)
                {
                    await FileIO.WriteTextAsync(file, string.Empty);
                }

                sampleFile = await storageFolder.GetFileAsync(path);
                var stream = await sampleFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
                Document document = new Document(PageSize.A4, 25, 25, 30, 30);
                PdfWriter writer = PdfWriter.GetInstance(document, stream.AsStream());
                document.Open();

                document.Add(new Paragraph("Mini Statement"));
                document.Add(new Chunk("\n")); // to all line breaks
                document.Add(new Chunk("\n"));

                PdfPTable tableLayout = new PdfPTable(4);
                float[] headers = { 60, 60, 60, 60 };
                tableLayout.SetWidths(headers);
                tableLayout.HorizontalAlignment = Element.ALIGN_LEFT;
                tableLayout.WidthPercentage = 80;
                //Add header
                AddCellToHeader(tableLayout, "Sr no.");
                AddCellToHeader(tableLayout, "Transaction Type");
                AddCellToHeader(tableLayout, "Date");
                AddCellToHeader(tableLayout, "Amount");

                AddCellToBody(tableLayout, "1.");
                AddCellToBody(tableLayout, "Cash Withdrawal");
                AddCellToBody(tableLayout, "April 24, 2015");
                AddCellToBody(tableLayout, "2500");

                AddCellToBody(tableLayout, "2.");
                AddCellToBody(tableLayout, "Cash Deposit");
                AddCellToBody(tableLayout, "July 7, 2015");
                AddCellToBody(tableLayout, "3500");

                AddCellToBody(tableLayout, "3.");
                AddCellToBody(tableLayout, "Funds Transfer");
                AddCellToBody(tableLayout, "October 20, 2015");
                AddCellToBody(tableLayout, "930");

                AddCellToBody(tableLayout, "4.");
                AddCellToBody(tableLayout, "NEFT Transfer");
                AddCellToBody(tableLayout, "November 5, 2015");
                AddCellToBody(tableLayout, "10,000");

                AddCellToBody(tableLayout, "5.");
                AddCellToBody(tableLayout, "Cash Withdrawal");
                AddCellToBody(tableLayout, "April 24, 2015");
                AddCellToBody(tableLayout, "2500");

                AddCellToBody(tableLayout, "6.");
                AddCellToBody(tableLayout, "Cash Deposit");
                AddCellToBody(tableLayout, "July 7, 2015");
                AddCellToBody(tableLayout, "3500");

                AddCellToBody(tableLayout, "7.");
                AddCellToBody(tableLayout, "Funds Transfer");
                AddCellToBody(tableLayout, "October 20, 2015");
                AddCellToBody(tableLayout, "930");

                AddCellToBody(tableLayout, "8.");
                AddCellToBody(tableLayout, "NEFT Transfer");
                AddCellToBody(tableLayout, "November 5, 2015");
                AddCellToBody(tableLayout, "10,000");

                AddCellToBody(tableLayout, "9.");
                AddCellToBody(tableLayout, "NEFT Transfer");
                AddCellToBody(tableLayout, "November 5, 2015");
                AddCellToBody(tableLayout, "10,000");

                AddCellToBody(tableLayout, "10.");
                AddCellToBody(tableLayout, "Cash Withdrawal");
                AddCellToBody(tableLayout, "April 24, 2015");
                AddCellToBody(tableLayout, "2500");

                document.Add(tableLayout);

                // add image to the pdf
                StorageFile imgfile = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(@"Assets\verified.jpg");
                iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(new Uri((imgfile.Path)));
                document.Add(img);

                document.Close();
                writer.Close();
            }
            catch (Exception) { }
        }

And that is all. You have you pdf ready which can be saved and printed.



Download the entire source code.
Happy Coding !



No comments :

Post a Comment