温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c# - Itext7 Saving table margins if the table goes to the next page
c# itext7

c# - itext7如果表转到下一页,则保存表边距

发布于 2020-04-21 10:45:47

有人可以帮我吗,我正在托盘中创建一个pdf文件,里面有一张员工表,我从数据库中获取员工数据,因此该表可以占据文档的至少一页。

我设置表的边距

table.SetMarginTop(100);
table.SetMarginBottom(20);

但是,一旦员工数据生成了pdf文档的另一页,利润就会丢失

这是我如何生成pdf和一些屏幕截图的完整代码

internal bool CreatePdfInspectorDelegates(string storeName, DateTimePicker date, string inspector, DataTable delegateStoreDT, DataTable delegateEmployeeDT)
{try
    {
        string auxPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        auxPath = auxPath + @"\PDF\Creados\notifacionInspectorDelegados" + storeName + ".pdf";

        PdfWriter writer = new PdfWriter(auxPath);
        PageSize ps = PageSize.LETTER;
        PdfDocument pdf = new PdfDocument(writer);
        Document doc = new Document(pdf, ps);

        //Fuentes de texto
        PdfFont fontNormal = PdfFontFactory.CreateFont(StandardFonts.TIMES_ROMAN);
        PdfFont fontBold = PdfFontFactory.CreateFont(StandardFonts.TIMES_BOLD);

        //Datos
        string dateIn = String.Format("Fecha{0}", date.Value.ToString("dd/MM/yyyy"));
        string instpector = String.Format("{0}", date.Value.ToString("dd/MM/yyyy"));

        //Cuerpo
        Paragraph pTittel = new Paragraph();
        pTittel.SetPaddingTop(70);
        pTittel.SetFixedLeading(25);
        Text text = new Text("NOTIFICACIÓN AL INSPECTOR O INSPECTORA DEL TRABAJO\n DE LA VOLUNTAD DE LOS TRABAJADORES Y LAS TRABAJADORAS\n DE ELEGIR A LOS DELEGADOS Y A LAS DELEGADAS DE PREVENCIÓN").SetFont(fontBold).SetTextAlignment(TextAlignment.CENTER);
        pTittel.SetTextAlignment(TextAlignment.CENTER);
        pTittel.Add(text);

        Paragraph pBody = new Paragraph();
        pBody.SetFixedLeading(22);
        Text text2 = new Text("\nFecha: ").SetFont(fontNormal);
        Text textDate = new Text(date.Value.ToString("dd/MM/yyyy")).SetFont(fontNormal).SetUnderline();
        Text text3 = new Text("\n\nCiudadano(a):\n").SetFont(fontNormal);
        Text textInspector = new Text(inspector).SetFont(fontNormal).SetUnderline();
        Text text4= new Text("\n\nNosotros, los(as) trabajadores(as), en cumplimiento a lo señalado en el artículo 41 de la Ley Orgánica de Prevención, Condiciones y Medio Ambiente de Trabajo(Lopcymat) y del artículo 58 de su Reglamento Parcial, nos dirigimos a Usted con el objeto de manifestarle nuestra voluntad de elegir a los Delegados y / o Delegadas de Prevención correspondientes a la entidad de trabajo: ").SetFont(fontNormal);
        Text textCenter = new Text("GRUPO TOTAL 99 C.A.").SetFont(fontBold).SetUnderline();
        Text text5 = new Text(" cuya dirección es: ").SetFont(fontNormal);
        Text textCenterAddress = new Text("CALLE LAS VEGAS CRUCE CON SOLEDAD EDIFICIO CLARIANT VENEZUELA, ZONA INDUSTRIAL DE LA TRINIDAD, CARACAS. ").SetFont(fontNormal).SetUnderline();
        Text text6 = new Text(" , específicamente los correspondientes al centro de trabajo: ").SetFont(fontNormal);
        Text textBranch = new Text(GetStoreBranch(delegateStoreDT).ToUpper()).SetFont(fontNormal).SetUnderline();
        Text text7 = new Text(" , ubicado en: ").SetFont(fontNormal);
        Text textBranchAddress = new Text(GetStoreAddress1(delegateStoreDT).ToUpper() + ", " + GetStoreAddress2(delegateStoreDT).ToUpper()).SetFont(fontNormal).SetUnderline();
        Text text8 = new Text("\n\nNotificación que se hace para efectos del artículo 59 del Reglamento Parcial de la Ley Orgánica de Prevención, Condiciones y Medio Ambiente de Trabajo(RLopcymat).\n\nA continuación firman los(as) trabajadores(as) solicitantes:\n").SetFont(fontNormal);

        pBody.Add(text2);
        pBody.Add(textDate);
        pBody.Add(text3);
        pBody.Add(textInspector);
        pBody.Add(text4);
        pBody.Add(textCenter);
        pBody.Add(text5);
        pBody.Add(textCenterAddress);
        pBody.Add(text6);
        pBody.Add(textBranch);
        pBody.Add(text7);
        pBody.Add(textBranchAddress);
        pBody.Add(text8);

        pBody.SetTextAlignment(TextAlignment.JUSTIFIED);

        doc.Add(pTittel);
        doc.Add(pBody);

        //Segunda pagina
        doc.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));

        //Empleados
        float[] columnWidths = { 5, 5, 5, 5, 4 };
        Table table = new Table(UnitValue.CreatePercentArray(columnWidths));
        table.SetWidth(UnitValue.CreatePercentValue(100));


        Cell[] header =
        {
        new Cell().SetBackgroundColor(new DeviceGray(0.75f)).Add(new Paragraph("Nombres y Apeliidos").SetTextAlignment(TextAlignment.CENTER).SetBold()),
        new Cell().SetBackgroundColor(new DeviceGray(0.75f)).Add(new Paragraph("Cedula\nIdentidad N°").SetTextAlignment(TextAlignment.CENTER).SetBold()),
        new Cell().SetBackgroundColor(new DeviceGray(0.75f)).Add(new Paragraph("Cargo Actual").SetTextAlignment(TextAlignment.CENTER).SetBold()),
        new Cell().SetBackgroundColor(new DeviceGray(0.75f)).Add(new Paragraph("Firma").SetTextAlignment(TextAlignment.CENTER).SetBold()),
        new Cell().SetBackgroundColor(new DeviceGray(0.75f)).Add(new Paragraph("Huella").SetTextAlignment(TextAlignment.CENTER).SetBold())
        };

        foreach (Cell cells in header)
        {
            table.AddCell(cells);
        }


        foreach (DataRow row in delegateEmployeeDT.Rows)
        {
            if (row[0].ToString() == "True")
            {
                table.AddCell(new Cell().SetMinHeight(80).SetTextAlignment(TextAlignment.CENTER).Add(new Paragraph(row[2].ToString().ToUpper() + "\n" + row[3].ToString().ToUpper()).SetTextAlignment(TextAlignment.CENTER)));
                table.AddCell(new Cell().SetMinHeight(80).SetTextAlignment(TextAlignment.CENTER).Add(new Paragraph(row[4].ToString().ToUpper()).SetTextAlignment(TextAlignment.CENTER)));
                table.AddCell(new Cell().SetMinHeight(80).SetTextAlignment(TextAlignment.CENTER).Add(new Paragraph(row[5].ToString().ToUpper()).SetTextAlignment(TextAlignment.CENTER)));
                table.AddCell(new Cell().SetMinHeight(80).SetTextAlignment(TextAlignment.CENTER).Add(new Paragraph("")));
                table.AddCell(new Cell().SetMinHeight(80).SetTextAlignment(TextAlignment.CENTER).Add(new Paragraph("")));               
            }
        }

        table.SetMarginTop(100);
        table.SetMarginBottom(20);
        doc.Add(table);
        doc.Close();
        return true;
    }
    catch (Exception e)
    {
        return false;
    }
}

保证金损失

有保证金

查看更多

提问者
Edgar Gomez
被浏览
161
Alexey Subach 2020-02-04 14:19

不应将顶部和底部页边距应用于跨越几页的表格部分。它们仅定义前一个元素和当前元素之间的空间(顶部边缘)以及当前元素和下一个元素之间的空间(底部边缘)。

如果要在跨页面拆分时保留表格顶部的间距,可以使用页眉和页脚功能。在表格所占据的每一页上,表的页眉和页脚都重复出现,您可以添加一个没有固定高度的边框的单元格,这将导致每页上的间距。这是一个例子:

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName));
Document doc = new Document(pdfDoc, PageSize.A4.rotate());

doc.add(new Paragraph("Starting text"));

Table table = new Table(UnitValue.createPercentArray(5)).useAllAvailableWidth();
table.addHeaderCell(new Cell(1, 5).setHeight(100).setBorder(Border.NO_BORDER));
table.addHeaderCell(new Cell(1, 5).
        add(new Paragraph("Header")));
table.addFooterCell(new Cell(1, 5).
        add(new Paragraph("Footer")));
table.addFooterCell(new Cell(1, 5).setHeight(100).setBorder(Border.NO_BORDER));
for (int i = 0; i < 350; i++) {
    table.addCell(new Cell().add(new Paragraph(String.valueOf(i + 1))));
}

doc.add(table);
doc.close();

结果如下所示:

结果