在多个页面中拆分大表

时间:2012-10-05 09:31:09

标签: c# pdf winnovative

输入:二维矩阵(20000x20000)
输出:带表的pdf文档,包含矩阵数据

如何在不缩放字体大小的情况下在几页中水平和垂直分割表格?现在我只能生成一页文档。 Winnovative库只是缩放字体大小。 我现在使用HtmlToPdfElement对象,但我可以使用任何其他技术,因为我的输入数据是一个矩阵。

Func<string> generateRow = () =>
{
    var result = new StringBuilder(10000000);
    for (var i = 0; i < 100; i++)
    {
        result.Append("<tr>");
        for (var j = 0; j < 100; j++)
        {
            result.Append("<td>" + i + "," + j + "</td>");
        }
        result.Append("</tr>");
    }
    return result.ToString();
};

var htmlStr = "<html>" +
              "<head><style>td { border: 1px solid black; padding: 2px; } table { border-collapse: collapse; }</style></head>" +
              "<body><table style='border-width: 1px; border-color: black; border-style: solid;'>" +
              generateRow() +
              "</table></body></html>";

var document = new Document();
var page1 = document.Pages.AddNewPage(PageSize.A4, new Margins(10, 10, 10, 10));

var htmlToPdfElem = new HtmlToPdfElement(0, 0, PageSize.A4.Width - 20, PageSize.A4.Height - 20, htmlStr, null, -1, -1);
page1.AddElement(htmlToPdfElem);
document.Save("test.pdf");

1 个答案:

答案 0 :(得分:0)

我认为没有办法水平分割 - 这可能会导致未定义的行为。实际上,copmponent试图在“虚拟”浏览器中呈现你的html。浏览器是一种不知不觉的页面。

因此,在您的情况下,我建议您查看您生成的内容的宽度。例如,确定哪些列切片应转到当前页面。

string generateRow(int pageNo, int colunmsPerPage) =>
{  
    var i = colunmsPerPage;
    while(i-- > 0)
       //add single row with specified columns rage
       stringData += data[currentRow][colunmsPerPage * pageNo + i];
   return stringData;
};

您还可以指定较大的页面大小,并依赖于pdf阅读器的打印功能。

垂直分割是自动完成的 - 实际上你在指定了所需的高度时禁用了它。如果您传递“自动”,内容将自动分成几页:

var htmlToPdfElem = new HtmlToPdfElement(0, 0, PageSize.A4.Width - 20, -1 /*auto*/, htmlStr, null);