#pdfmake
#pdfmake
Вопрос:
Я использую pdfmake для создания документа, который содержит ряд вложенных документов, например, PDF, содержащий счета; каждый счет является логическим документом внутри документа PDF.
У меня есть требование, чтобы в нижнем колонтитуле каждой страницы я показывал «Страницу», где оба этих номера относятся к одному счету-фактуре, а не ко всему документу.
Обратные вызовы верхнего и нижнего колонтитулов выглядят хорошо, но указывают только номер страницы и количество относительно всего документа, а обратный вызов pageBreakBefore не генерирует ничего похожего на документированную информацию, и в любом случае я не могу понять, как я мог бы использовать это здесь.
Это не похоже на уникальное требование, поэтому, надеюсь, я просто упускаю что-то очевидное.
Спасибо!
Ответ №1:
Я полагаю, что аргументы функции верхнего и нижнего колонтитулов pdkmake могут содержать только глобальное количество страниц.
Однако есть способ воспроизвести желаемое поведение, если вы вручную обрабатываете разрывы страниц :
const realPageIndexes = [];
let currSubPdfIdx = 0;
let currPageCountForSubPdf = 0;
const getPageBreak = (newSubPdfIdx: number) => {
if (currSubPdfIdx !== newSubPdfIdx) {
currSubPdfIdx = newSubPdfIdx;
currPageCountForSubPdf = 0;
} else {
currPageCountForSubPdf = 1;
}
realPageIndexes.push(currPageCountForSubPdf);
return {text: '', pageBreak: 'after'}; // return elem causing the pageBreak
}
Функция нижнего колонтитула, заполняющая номера страниц, вызывается после завершения генерации определения документа.
Если вы будете обрабатывать каждое переполнение самостоятельно, вызывая getPageBreak(currentSubPdfIndex) в конце каждой страницы, вы в конечном итоге узнаете, какой вложенный PDF-файл отображается на каждой странице :
- Я отображаю часть первого вложенного файла PDF на странице 1:
- Я отображаю конец первого вложенного файла PDF на странице 2
- Я отображаю 2-й вложенный файл PDF на странице 3
- Я отображаю 3-й вложенный файл PDF на странице 4….
.
let subPdfIdx = 0;
pdfContent.push(subPdf1FirstPart)
pdfContent.push(getPageBreak(subPdfIdx))
pdfContent.push(subPdf1SecondPart)
pdfContent.push(getPageBreak(subPdfIdx))
subPdfIdx ;
pdfContent.push(subPdf2)
pdfContent.push(getPageBreak(subPdfIdx))
subPdfIdx ;
pdfContent.push(subPdf3)
pdfContent.push(getPageBreak(subPdfIdx))
realPageIndexes [] тогда выглядит следующим образом :
[ 1, 1, 2, 3 ];
Единственный оставшийся шаг — указать функции нижнего колонтитула использовать количество страниц, которое мы только что создали, вместо глобального количества страниц :
const documentDefinition = {
content: [YOUR CONTENT],
footer: (currPage, allPages) => 'subPdf index is ' realPageIndexes[currPage];
}
Пожалуйста, обратите внимание, что этот метод не сработает, если вы неправильно обрабатываете переполнения:
если, например, абзац слишком велик, чтобы вместить страницу, и после этого вы вызываете getPageBreak(), pdfmake автоматически создаст новую страницу в конце абзаца (страницу, которая не отслеживается в наших realPageIndexes), а затем добавит страницу, вызванную вашим getPageBreak(), сразу после конца текста. Поэтому просто убедитесь, что страница не переполняется 🙂