Как эффективно сгенерировать таблицу с большим количеством строк с помощью iText 7 - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь создать 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();
        }

Это наводит меня на мысль, что эта библиотека просто недостаточно быстра для нашего варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...