public static MemoryStream Generate(DPPVATBankExpenditureNoteDto data, int timezoneOffset)
        {
            var document = new Document(PageSize.A4.Rotate(), 20, 20, 20, 20);
            var stream   = new MemoryStream();
            var writer   = PdfWriter.GetInstance(document, stream);

            document.Open();

            SetTitle(document, data, timezoneOffset);
            SetTable(document, data, timezoneOffset);
            SetFooter(document);

            document.Close();
            byte[] byteInfo = stream.ToArray();
            stream.Write(byteInfo, 0, byteInfo.Length);
            stream.Position = 0;

            return(stream);
        }
        private static void SetTitle(Document document, DPPVATBankExpenditureNoteDto data, int timezoneOffset)
        {
            var table = new PdfPTable(3)
            {
                WidthPercentage     = 100,
                HorizontalAlignment = Element.ALIGN_LEFT
            };

            table.SetWidths(new float[] { 6f, 3f, 3f });

            var cellCenter = new PdfPCell()
            {
                Border = Rectangle.NO_BORDER,
                HorizontalAlignment = Element.ALIGN_CENTER,
                VerticalAlignment   = Element.ALIGN_CENTER
            };

            var cellLeft = new PdfPCell()
            {
                Border = Rectangle.NO_BORDER,
                HorizontalAlignment = Element.ALIGN_LEFT,
                VerticalAlignment   = Element.ALIGN_CENTER
            };

            cellCenter.Colspan = 3;
            cellCenter.Phrase  = new Phrase("BUKTI PENGELUARAN BANK", _headerFont);
            table.AddCell(cellCenter);
            cellCenter.Phrase = new Phrase("\n", _headerFont);
            table.AddCell(cellCenter);
            cellCenter.Colspan = 1;

            cellLeft.Phrase = new Phrase("PT DAN LIRIS", _subHeaderFont);
            table.AddCell(cellLeft);
            cellLeft.Phrase = new Phrase("Tanggal", _subHeaderFont);
            table.AddCell(cellLeft);
            cellLeft.Phrase = new Phrase($": {data.Date.AddHours(timezoneOffset).ToString("dd/MMMM/yyyy")}", _subHeaderFont);
            table.AddCell(cellLeft);

            cellLeft.Phrase = new Phrase("Kel. Banaran, Kec. Grogol", _subHeaderFont);
            table.AddCell(cellLeft);
            cellLeft.Phrase = new Phrase("NO", _subHeaderFont);
            table.AddCell(cellLeft);
            cellLeft.Phrase = new Phrase($": {data.DocumentNo}", _subHeaderFont);
            table.AddCell(cellLeft);

            cellLeft.Phrase = new Phrase("Sukoharjo - 57100", _subHeaderFont);
            table.AddCell(cellLeft);
            cellLeft.Phrase = new Phrase("Dibayarkan ke", _subHeaderFont);
            table.AddCell(cellLeft);
            cellLeft.Phrase = new Phrase($": {data.Supplier.Name}", _subHeaderFont);
            table.AddCell(cellLeft);

            cellLeft.Phrase = new Phrase("", _subHeaderFont);
            table.AddCell(cellLeft);
            cellLeft.Phrase = new Phrase("Bank", _subHeaderFont);
            table.AddCell(cellLeft);
            cellLeft.Phrase = new Phrase($": {data.Bank.BankName} {data.Currency.Code} - A/C : {data.Bank.AccountNumber}", _subHeaderFont);
            table.AddCell(cellLeft);

            document.Add(table);
        }
        private static void SetTable(Document document, DPPVATBankExpenditureNoteDto data, int timezoneOffset)
        {
            var table = new PdfPTable(5)
            {
                WidthPercentage     = 100,
                HorizontalAlignment = Element.ALIGN_LEFT
            };

            table.SetWidths(new float[] { 1f, 3f, 3f, 2f, 6f });

            var cellCenter = new PdfPCell()
            {
                HorizontalAlignment = Element.ALIGN_CENTER,
                VerticalAlignment   = Element.ALIGN_CENTER
            };

            var cellCenterBorderless = new PdfPCell()
            {
                HorizontalAlignment = Element.ALIGN_CENTER,
                VerticalAlignment   = Element.ALIGN_CENTER,
                Border = Rectangle.NO_BORDER
            };

            var cellLeft = new PdfPCell()
            {
                HorizontalAlignment = Element.ALIGN_LEFT,
                VerticalAlignment   = Element.ALIGN_CENTER
            };

            var cellLeftBorderless = new PdfPCell()
            {
                HorizontalAlignment = Element.ALIGN_LEFT,
                VerticalAlignment   = Element.ALIGN_CENTER,
                Border = Rectangle.NO_BORDER
            };

            var cellRight = new PdfPCell()
            {
                HorizontalAlignment = Element.ALIGN_RIGHT,
                VerticalAlignment   = Element.ALIGN_CENTER
            };

            cellCenter.Phrase = new Phrase("No.", _subHeaderFont);
            table.AddCell(cellCenter);
            cellCenter.Phrase = new Phrase("No. SPB", _subHeaderFont);
            table.AddCell(cellCenter);
            cellCenter.Phrase = new Phrase("Kategori Barang", _subHeaderFont);
            table.AddCell(cellCenter);
            cellCenter.Phrase = new Phrase("Mata Uang", _subHeaderFont);
            table.AddCell(cellCenter);
            cellCenter.Phrase = new Phrase("Jumlah", _subHeaderFont);
            table.AddCell(cellCenter);

            var rowNumber = 1;
            var total     = 0.0;

            foreach (var item in data.Items)
            {
                cellCenter.Phrase = new Phrase(rowNumber.ToString(), _normalFont);
                table.AddCell(cellCenter);
                cellLeft.Phrase = new Phrase(item.InternalNote.DocumentNo, _normalFont);
                table.AddCell(cellLeft);
                cellLeft.Phrase = new Phrase(string.Join("\n", item.InternalNote.Items.Select(element => $"- {element.Invoice.Category.Name}")), _subHeaderFont);
                table.AddCell(cellLeft);
                cellCenter.Phrase = new Phrase(item.InternalNote.Currency.Code, _subHeaderFont);
                table.AddCell(cellCenter);
                cellCenter.Phrase = new Phrase(item.InternalNote.Items.Sum(itemInvoice => itemInvoice.Invoice.Amount).ToString(), _subHeaderFont);
                table.AddCell(cellCenter);
                total += item.InternalNote.Items.Sum(itemInvoice => itemInvoice.Invoice.Amount);
            }

            cellCenter.Phrase = new Phrase("", _normalFont);
            table.AddCell(cellCenter);
            cellCenter.Phrase = new Phrase("", _normalFont);
            table.AddCell(cellCenter);
            cellCenter.Phrase = new Phrase("", _normalFont);
            table.AddCell(cellCenter);
            cellRight.Phrase = new Phrase("Total", _normalBoldFont);
            table.AddCell(cellRight);
            cellRight.Phrase = new Phrase(total.ToString(), _normalBoldFont);
            table.AddCell(cellRight);

            cellLeftBorderless.Colspan = 5;
            cellLeftBorderless.Phrase  = new Phrase("\n", _normalBoldFont);
            table.AddCell(cellLeftBorderless);
            cellLeftBorderless.Colspan = 2;
            cellLeftBorderless.Phrase  = new Phrase("Terbilang", _normalBoldFont);
            table.AddCell(cellLeftBorderless);
            cellLeftBorderless.Colspan = 3;
            cellLeftBorderless.Phrase  = new Phrase($": {data.Currency.Code} {NumberToTextIDN.terbilang(total)}", _normalBoldFont);
            table.AddCell(cellLeftBorderless);

            cellLeftBorderless.Colspan = 5;
            cellLeftBorderless.Phrase  = new Phrase("\n", _normalBoldFont);
            table.AddCell(cellLeftBorderless);

            document.Add(table);
        }