Я пытаюсь создать PDF-документ, используя базовую библиотеку iText 7. Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что она действительно медленная, и для количества записей, с которыми я тестировал (3000 строк, в которых одна строка состоит из 12 столбцов. Фактически необходимое число будет гораздо выше), потребуется около 3 минут.
Ниже я приведу вам то, что я уже пробовал, и методы, которые на самом деле дают мне медленные результаты записи.
await Task.Run(() =>
{
LoadLicense();
listOfValues = GetListOfValues(values);
var pdfDocument = new PdfDocument(new PdfWriter(targetPath));
var document = new Document(pdfDocument, PageSize.A4);
var table = new Table(new[] { 10f, 5f, 5f, 5f, 5f, 5f, 5f, 5f, 5f, 5f, 5f, 5f });
table.SetWidth(UnitValue.CreatePercentValue(100))
.SetTextAlignment(TextAlignment.CENTER)
.SetHorizontalAlignment(HorizontalAlignment.CENTER);
// HeaderTitlesList is just an array of strings
foreach (var title in HeaderTitlesList)
{
WriteHeader(table, title);
}
for (var row = 0; row < measurement.MeasurementPoints.Count; row++)
{
WriteRow(table, $"{listOfValues[row].main}");
WriteRow(table, $"{listOfValues[row].first}");
WriteRow(table, $"{listOfValues[row].second}");
WriteRow(table, $"{listOfValues[row].third}");
WriteRow(table, $"{listOfValues[row].fifth:0.###}");
WriteRow(table, $"{listOfValues[row].sixth}");
WriteRow(table, $"{listOfValues[row].seventh:0.###}");
WriteRow(table, $"{listOfValues[row].eighth}");
WriteRow(table, $"{listOfValues[row].nineth}");
WriteRow(table, $"{listOfValues[row].tenth:0.###}");
WriteRow(table, $"{listOfValues[row].main:0}");
WriteRow(table, $"{listOfValues[row].main:0.##}");
}
document.Add(table);
document.Close();
}, cancellationToken);
return true;
}
private static void WriteRow(Table table, string cellVal)
{
table.AddCell(cellVal).SetBorder(new SolidBorder(new DeviceRgb(0, 0, 0), 0.5f));
}
private static void WriteHeader(Table table, string title)
{
var cell = new Cell().Add(new Paragraph(title));
cell.SetFont(PdfFont)
.SetBackgroundColor(new DeviceRgb(0, 74, 136))
.SetFontColor(new DeviceRgb(255, 255, 255))
.SetPadding(5)
.SetBorder(CellBorder);
table.AddHeaderCell(cell);
}
Можно ли вместо записи всех этих значений ячейка за ячейкой генерировать их строка за строкой? Мы ценим все, что могло бы сделать процесс создания PDF как минимум чуть быстрее.
РЕДАКТИРОВАТЬ:
Я только что попытался использовать предложенный метод iText из сообщения здесь и попробовал довольно небольшой, в нашем случае, вариант использования, где нужно было написать около 40 000 ячеек. Это уже занимает больше минуты.
protected void manipulatePdf(string dest)
{
var pdfDoc = new PdfDocument(new PdfWriter(dest));
var doc = new Document(pdfDoc);
var table = new Table(UnitValue.CreatePercentArray(12), true);
foreach (var cellVal in HeaderTitlesList)
{
table.AddHeaderCell(new Cell().SetKeepTogether(true).Add(new Paragraph(cellVal)));
}
doc.Add(table);
for (int i = 0; i < 40000; i++)
{
if (i % 12 == 0)
{
table.Flush();
}
table.AddCell(new Cell().SetKeepTogether(true).Add(new Paragraph("Test " + i).SetMargins(0, 0, 0, 0)));
}
table.Complete();
doc.Close();
}
Это наводит меня на мысль, что эта библиотека просто недостаточно быстра для нашего варианта использования.