0

我有一个要转换成 PDF 的大表格。它的前 1/6 看起来像这样:

http://i.imgur.com/y4pO8Th.png

然而,输入字段的数量从每节 1 到 20 不等,我需要能够智能地使该文档分页。我的计划是最初逐张绘制表格,并通过抓取所有先前表格中的行数来管理 Y 坐标。这行得通,但是当我进入分页符时就崩溃了,我开始需要一些半复杂的逻辑来使其工作,而且这种逻辑随着每个附加表的添加而变得越来越混乱。

我的第二个计划是在 PDF 中重现 HTML 文档的表格结构,我成功地做到了……

private void DrawPDF()
{
    Document tDoc = new Document();
    MigraDoc.DocumentObjectModel.Style style = tDoc.Styles["Normal"];
    style.Font.Name = tPdfFont;
    style.Font.Size = 10;
    Section tSec = tDoc.AddSection();

    MigraDoc.DocumentObjectModel.Tables.Table masterTable = new MigraDoc.DocumentObjectModel.Tables.Table();
    masterTable = tSec.AddTable();
    masterTable.Borders.Visible = false;

    Column leftColumn = masterTable.AddColumn("365pt");
    Column spacer = masterTable.AddColumn("10pt");
    Column rightColumn = masterTable.AddColumn("365pt");

    Row tFS = masterTable.AddRow();
    Cell tCell = tFS.Cells[0];

    //
    // Farm Assets Column
    //
    {
        MigraDoc.DocumentObjectModel.Tables.Table tAssetsTable = new MigraDoc.DocumentObjectModel.Tables.Table();
        tAssetsTable.Borders.Visible = false;
        Column tColumn = tAssetsTable.AddColumn("365pt");
        tCell.Elements.Add(tAssetsTable);



        //
        // Current Farm Assets
        //
        for (int i = 0; i < 10; i++)  // Drawn 10 times to force it to draw over the 1st page.
        {
            Section thisSection = tDoc.AddSection();
            Row tAssetsRow = tAssetsTable.AddRow();
            Cell tAssetsCell = tAssetsRow.Cells[0];

            MigraDoc.DocumentObjectModel.Tables.Table table = new MigraDoc.DocumentObjectModel.Tables.Table();
            table = thisSection.AddTable();
            table.Borders.Width = 0.2;
            table.Rows.LeftIndent = 0;

            Column columnData = table.AddColumn("295pt");
            columnData.Borders.Left.Visible = false;
            Column columnValue = table.AddColumn("70pt");

            Row rowA = table.AddRow();
            rowA.Shading.Color = Color.FromRgbColor((byte)255, Color.Parse("0xa2a2d2"));
            rowA.Cells[0].AddParagraph("CURRENT FARM ASSETS");
            rowA.Cells[1].AddParagraph("$ Value");
            rowA.Cells[1].Format.Alignment = ParagraphAlignment.Right;

            Row row1 = table.AddRow();
            row1.Borders.Bottom.Visible = false;
            row1.Cells[0].AddParagraph("Cash: Savings: ($" + MP.FormFinancialStatement.CurrentStaticAssets.Savings + ") Checking: ($" + MP.FormFinancialStatement.CurrentStaticAssets.Checking + ")");
            row1.Cells[1].AddParagraph(MP.FormFinancialStatement.CurrentStaticAssets.CashTotal);
            row1.Cells[1].Format.Alignment = ParagraphAlignment.Right;

            Row row2 = table.AddRow();
            row2.Borders.Bottom.Visible = false;
            row2.Cells[0].AddParagraph("Invest: Time Cret $" + MP.FormFinancialStatement.CurrentStaticAssets.TimeCret + " Other: $" + MP.FormFinancialStatement.CurrentStaticAssets.OtherInvestments + "");
            row2.Cells[1].AddParagraph(MP.FormFinancialStatement.CurrentStaticAssets.InvestTotal);
            row2.Cells[1].Format.Alignment = ParagraphAlignment.Right;

            Row row3 = table.AddRow();
            row3.Borders.Bottom.Visible = false;
            row3.Cells[0].AddParagraph("Replacement Account");
            row3.Cells[1].AddParagraph(MP.FormFinancialStatement.CurrentStaticAssets.ReplacementAccount);
            row3.Cells[1].Format.Alignment = ParagraphAlignment.Right;

            Row row4 = table.AddRow();
            row4.Cells[0].AddParagraph("Accouts and Notes Recievable");
            row4.Cells[1].AddParagraph(MP.FormFinancialStatement.CurrentStaticAssets.AccountsNotesReceivable);
            row4.Cells[1].Format.Alignment = ParagraphAlignment.Right;

            MigraDoc.DocumentObjectModel.Tables.Table clone = (MigraDoc.DocumentObjectModel.Tables.Table)table.Clone();

            tAssetsCell.Elements.Add(clone);
        }
    }

    MigraDoc.Rendering.DocumentRenderer docRenderer = new DocumentRenderer(tDoc);
    docRenderer.PrepareDocument();
    docRenderer.RenderObject(gfx, 30, 85, "740pt", masterTable);
}

但是,这实际上并没有正确地打破页面。我尝试分割每个单独的表,希望这会产生分页魔法,但事实并非如此。

我如何构建它以允许良好的分页符?

4

1 回答 1

1

您可以使用表行的 KeepWith 属性将块保持在一页上。仅将其用于肯定适合一页的块。

另请参阅:
https ://stackoverflow.com/a/6831048/1015447
https://stackoverflow.com/a/1327228/1015447

于 2013-10-11T21:43:01.250 回答