проблема pdfmake с отображением точных номеров страниц

#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(), сразу после конца текста. Поэтому просто убедитесь, что страница не переполняется 🙂