private static void DesenharTabela(XGraphics gfx, UsuarioCertificadoCertame certificadoUsuario, PdfPage pagina)
        {
            var pen = new XPen(XColor.FromName("black"));

            double topoTabela = 250;

            DesenharCelula(gfx, 10, topoTabela, 220, 20, pen, "Área", true);
            DesenharCelula(gfx, 220, topoTabela, 440, 20, pen, "Situação de Comparecimento", true);
            DesenharCelula(gfx, 440, topoTabela, 500, 20, pen, "Nota", true);
            DesenharCelula(gfx, 500, topoTabela, 585, 20, pen, "Situação", true);

            topoTabela += 20;

            DesenharCelula(gfx, 10, topoTabela, 220, 20, pen, certificadoUsuario.CertificadoCertame.NomeCertificado);
            DesenharCelula(gfx, 220, topoTabela, 440, 20, pen, certificadoUsuario.Situacao?.GetDescription());
            DesenharCelula(gfx, 440, topoTabela, 500, 20, pen, certificadoUsuario.Nota?.ToString("0.00") ?? "0.00");
            DesenharCelula(gfx, 500, topoTabela, 585, 20, pen, $"{certificadoUsuario.Status.GetDescription()}");

            var medidaJustificativa = gfx.MeasureString(certificadoUsuario.Justificativa ?? " ", new XFont("Verdana", 12));

            var alturaJustificativa =
                medidaJustificativa.Height * Math.Ceiling(medidaJustificativa.Width / 585);

            topoTabela = pagina.Height - 50 - alturaJustificativa;

            DesenharCelula(gfx, 10, topoTabela, 585, 20, pen,
                           "Resultado da apresentação de justificativa à ausência no dia da prova", true, true);

            topoTabela += 20;

            DesenharCelula(gfx, 10, topoTabela, 585, alturaJustificativa, pen,
                           certificadoUsuario.Justificativa);
        }
        private static void EscreverVerso(PdfDocument outputDocument, XPdfForm form,
                                          UsuarioCertificadoCertame certificadoUsuario,
                                          XFont font, XStringFormat format)
        {
            if (form.PageCount > 1)
            {
                var paginaVerso = outputDocument.AddPage();
                paginaVerso.Orientation = PageOrientation.Landscape;
                paginaVerso.Size        = PageSize.A4;

                form.PageNumber = 2;

                var posicaoId = new BMPosicaoDadoCertificadoCertame().ObterPorDadoAno("id",
                                                                                      certificadoUsuario.CertificadoCertame.Ano);

                if (posicaoId == null)
                {
                    throw new Exception("Posição de dado obrigatório não informada no verso");
                }

                var gfx = XGraphics.FromPdfPage(paginaVerso);
                gfx.DrawImage(form, new XRect(0, 0, form.PointWidth, form.PointHeight));

                EscreverDado(paginaVerso, posicaoId, gfx, font, format, certificadoUsuario.Chave);
            }
        }
        private static void EscreverFrente(PdfDocument outputDocument, XPdfForm form,
                                           UsuarioCertificadoCertame certificadoUsuario,
                                           XFont font, XStringFormat format)
        {
            var paginaFrente = outputDocument.AddPage();

            paginaFrente.Orientation = PageOrientation.Landscape;
            paginaFrente.Size        = PageSize.A4;

            form.PageNumber = 1;

            var manterPosicaoDado = new BMPosicaoDadoCertificadoCertame();

            var posicaoNome = manterPosicaoDado.ObterPorDadoAno("nome", certificadoUsuario.CertificadoCertame.Ano);
            var posicaoCpf1 = manterPosicaoDado.ObterPorDadoAno("cpf1", certificadoUsuario.CertificadoCertame.Ano);
            var posicaoCpf2 = manterPosicaoDado.ObterPorDadoAno("cpf2", certificadoUsuario.CertificadoCertame.Ano);

            if (posicaoNome == null || posicaoCpf1 == null || posicaoCpf2 == null)
            {
                throw new Exception("Posição de dado obrigatório não informada na frente");
            }

            var gfx = XGraphics.FromPdfPage(paginaFrente);

            gfx.DrawImage(form, new XRect(0, 0, form.PointWidth, form.PointHeight));

            EscreverDado(paginaFrente, posicaoNome, gfx, font, format, certificadoUsuario.Usuario.Nome);
            EscreverDado(paginaFrente, posicaoCpf1, gfx, font, format,
                         certificadoUsuario.Usuario.CPF.Substring(0, 9).Insert(3, ".").Insert(7, "."));
            EscreverDado(paginaFrente, posicaoCpf2, gfx, font, format, certificadoUsuario.Usuario.CPF.Substring(9, 2));

            if (certificadoUsuario.CertificadoCertame.Data.HasValue)
            {
                var data = certificadoUsuario.CertificadoCertame.Data.Value;

                var dataFormatada = string.Format("{0} de {1} de {2}", data.Day.ToString().PadLeft(2, '0'),
                                                  data.ObterNomeMes(), data.Year);

                var posicaoData = manterPosicaoDado.ObterPorDadoAno("data", certificadoUsuario.CertificadoCertame.Ano);

                EscreverDado(paginaFrente, posicaoData, gfx, font, format, dataFormatada);
            }

            if (!string.IsNullOrWhiteSpace(certificadoUsuario.CertificadoCertame.NomeCertificado))
            {
                var posicaoNomeCertificado = manterPosicaoDado.ObterPorDadoAno("nomecertificado",
                                                                               certificadoUsuario.CertificadoCertame.Ano);

                // Somente nesse caso, só insere o nome no PDF caso tenha o dado, pois alguns PDFs possuem o
                // nome neles, mas o campo "Nome" é obrigatório em todos os certificados.
                if (posicaoNomeCertificado != null)
                {
                    var fontNomeCertificado = new XFont("Verdana", 13, XFontStyle.Bold);

                    EscreverDado(paginaFrente, posicaoNomeCertificado, gfx, fontNomeCertificado, format,
                                 certificadoUsuario.CertificadoCertame.NomeCertificado.ToUpper());
                }
            }
        }
        private static byte[] GerarBoletim(UsuarioCertificadoCertame certificadoUsuario, string repostorioArquivo, DateTime horaAtual)
        {
            var outputDocument = new PdfDocument {
                PageLayout = PdfPageLayout.SinglePage
            };

            var font         = new XFont("Verdana", 12);
            var fontBold     = new XFont("Verdana", 12, XFontStyle.Bold);
            var centerFormat = new XStringFormat
            {
                Alignment     = XStringAlignment.Center,
                LineAlignment = XLineAlignment.Center
            };
            var leftFormat = new XStringFormat
            {
                Alignment     = XStringAlignment.Near,
                LineAlignment = XLineAlignment.Center
            };

            var pagina = outputDocument.AddPage();

            pagina.Orientation = PageOrientation.Portrait;
            pagina.Size        = PageSize.A4;

            var gfx = XGraphics.FromPdfPage(pagina);

            // Desenhar a logo do CESPE.
            gfx.DrawImage(XImage.FromFile(Path.Combine(repostorioArquivo, "BoletinsCertame", "cespe.png")),
                          new XRect(new XPoint(10, 10), new XPoint(130, 50)));

            // Desenhar data e hora
            gfx.DrawString(horaAtual.ToString("G", new CultureInfo("pt-BR")), new XFont("Verdana", 8), XBrushes.Black, pagina.Width / 2, 10, centerFormat);

            // Desenhar cabeçalho.
            gfx.DrawString("SEBRAE NACIONAL - Serviço de Apoio às Micro e Pequenas Empresas", font, XBrushes.Black,
                           pagina.Width / 2, 70, centerFormat);
            gfx.DrawString($"CERTIFICAÇÃO INTERNA DE CONHECIMENTOS - {certificadoUsuario.CertificadoCertame.Ano}", font,
                           XBrushes.Black, pagina.Width / 2, 90, centerFormat);
            gfx.DrawString("ESPELHO DE DESEMPENHO", font, XBrushes.Black, pagina.Width / 2, 110, centerFormat);

            // Desenhar dados do usuário
            gfx.DrawString("Nome:", fontBold, XBrushes.Black, 50, 140, leftFormat);
            gfx.DrawString(certificadoUsuario.Usuario.Nome, font, XBrushes.Black, 130, 140, leftFormat);

            gfx.DrawString("CPF:", fontBold, XBrushes.Black, 50, 160, leftFormat);
            gfx.DrawString(certificadoUsuario.Usuario.CPF, font, XBrushes.Black, 130, 160, leftFormat);

            gfx.DrawString("Inscrição:", fontBold, XBrushes.Black, 50, 180, leftFormat);
            gfx.DrawString(certificadoUsuario.NumeroInscricao ?? "", font, XBrushes.Black, 130, 180, leftFormat);

            gfx.DrawString("Unidade:", fontBold, XBrushes.Black, 50, 200, leftFormat);
            gfx.DrawString(certificadoUsuario.Usuario.Unidade ?? "", font, XBrushes.Black, 130, 200, leftFormat);

            // Desenhar a tabela.
            DesenharTabela(gfx, certificadoUsuario, pagina);

            var streamOutput = new MemoryStream();

            outputDocument.Save(streamOutput, false);

            return(streamOutput.ToArray());
        }