Разделить большой стол на несколько страниц
Вход: двумерная матрица (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 ответ
Я полагаю, что нет способа разделить по горизонтали - это может привести к неопределенному поведению. Фактически, коппонент пытается отобразить ваш 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 Reader.
Вертикальное разделение выполняется автоматически - фактически вы отключили его, когда указали желаемую высоту. Если вы передадите "auto", содержимое будет автоматически разделено на несколько страниц:
var htmlToPdfElem = new HtmlToPdfElement(0, 0, PageSize.A4.Width - 20, -1 /*auto*/, htmlStr, null);