Перебирайте записи базы данных в группах по пять человек, чтобы заполнить AcroFields с помощью iTextSharp - PullRequest
0 голосов
/ 09 октября 2018

В моем приложении .NET у меня есть PDF-форма, которая содержит пять записей на страницу.Мне нужно добавить записи базы данных на каждую страницу группами по пять записей на страницу, сопоставляя каждый столбец с определенным полем.Для каждой новой группы мне нужно было бы добавить новую страницу в pdf, похожую на в этом примере.

Я не могу найти ни одного примера для перебора результата запроса в пакете изпять записей каждая.

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Если вы работаете с SQL Server, вы можете использовать предложение ORDER BY, используя OFFSET-FETCH.OFFSET-FETCH позволяет вам возвращать только диапазон строк, выбранных по вашему запросу.Тем не менее, он добавляет функциональность для предоставления начальной точки (смещение) и значения, чтобы указать, сколько строк вы хотите вернуть (значение выборки).Это обеспечивает удобную технику для перелистывания результатов.

0 голосов
/ 09 октября 2018

Добро пожаловать в переполнение стека.Поскольку у меня нет опыта работы с iTextSharp, я напишу это в псевдо-c #.

Есть два основных способа справиться с этим:

  1. Итерация по всемзаписей и создайте новую страницу, когда номер записи кратен 5.

  2. Соберите pageSize (5) записей в массив и передайте код генерации вашей страницы.

Для первого варианта вы просто перебираете записи, как и при любом другом перечислении, считая по мере движения и начиная новую страницу, когда вам это нужно.Это выглядит примерно так:

public void WritePDF(string filename, IEnumerable<RecordType> records, int rowsPerPage = 5)
{
    using (var file = CreatePDFFile(filename))
    {
        bool inPage = false;
        int recordNumber = 0;
        foreach (var record in records)
        {
            int recordOffset = recordNumber % rowsPerPage;
            if (recordOffset == 0)
            {
                if (inPage)
                    FinishPage(file);
                StartPage(file);
                inPage = true;
            }
            WriteRecord(record, recordOffset);
            recordNumber++;
        }
        if (inPage)
            FinishPage(file);
    }
}

(Очевидно, вам необходимо предоставить (или заменить) методы CreatePDFFile, StartPage, FinishPage и WriteRecord.)

Второй вариант - сгруппировать записи в блоки по 5 и отправить эти группы в метод WritePage, который создает страницу и заполняет записи.Вот расширение (от макушки головы - может потребоваться некоторая работа) для выполнения группировки:

public static class Extensions
{
    public static IEnumerable<TRecord[]> Batch<TRecord>(this IEnumerable<TRecord> seq, int batchSize)
    {
        T[] buffer = null;
        int offset = 0;
        foreach (var record in seq)
        {
            if (buffer == null)
            {
                buffer = new T[batchSize];
                offset = 0;
            }
            buffer[offset++] = record;
            if (offset == batchSize)
            {
                yield return buffer;
                buffer = null;
            }
        }
        if (buffer != null)
        {
            yield return buffer.Take(offset).ToArray();
        }
    }
}

Оттуда ваше поколение PDF может выглядеть примерно так:

public void WritePDF(string filename, IEnumerable<RecordType> records, int rowsPerPage = 5)
{
    using (var file = CreatePDFFile(filename))
    {
        foreach (var batch in records.Batch(rowsPerPage))
            WritePDFPage(batch);
    }
}

Теперь ваш WritePDFPage всегда будет получать массив не более чем rowsPerPage элементов для записи.Последний вызов будет иметь все оставшиеся записи и может быть меньше размера вашей партии.

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