Добро пожаловать в переполнение стека.Поскольку у меня нет опыта работы с iTextSharp, я напишу это в псевдо-c #.
Есть два основных способа справиться с этим:
Итерация по всемзаписей и создайте новую страницу, когда номер записи кратен 5.
Соберите 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
элементов для записи.Последний вызов будет иметь все оставшиеся записи и может быть меньше размера вашей партии.