
Я использую пакет pdf-lib npm для обрезки PDF-файлов и управления ими.
Моя цель:
- Список элемент.
- Обрезать несколько горизонтальных фрагментов с каждой страницы.
- Повторно экспортировать эти фрагменты.
- Сложить их обратно на одну страницу того же размера, что и исходный PDF-файл.
Я создал небольшой веб-интерфейс, который позволяет мне визуально обрезать PDF-файл на горизонтальные фрагменты.
На стороне сервера я извлекаю эти фрагменты и экспортирую их как отдельные страницы PDF. Эта часть работает нормально.
Однако я заметил, что pdf-lib, похоже, читает/обрезает страницы снизу → сверху, поэтому мне пришлось вручную изменить порядок полей обрезки, чтобы сделать экспортированные страницы читабельными.
Сейчас мои выходные данные выглядят так:

Каждый обрезанный фрагмент становится отдельной страницей в экспортированном PDF-файле.
Это работает должным образом.
Чего я пытаюсь достичь.
Вместо того, чтобы создавать несколько страниц (по одной на каждый фрагмент), я хочу:
- Возьмите эти обрезанные фрагменты
- Сложите их вертикально
- Поместите их обратно одна страница с исходным размером страницы
Поэтому результатом должна быть восстановленная страница, состоящая из обрезанных «фрагментов».
Когда я пытаюсь это сделать, я сталкиваюсь с ограничением с помощью page.setCropBox():
На самом деле он не удаляет содержимое страницы
Он просто скрывает часть страницы
Когда я копирую эту страницу в другой документ, за ней все еще существует вся исходная страница
Поэтому, когда я пытаюсь «сложить» обрезанные фрагменты на одну страницу, каждая скопированная страница по-прежнему несет с собой полностью скрытый контент.
Это делает невозможным правильное перестроение/сложение фрагментов.
Мой текущий код
Код: Выделить всё
export async function StackPages(inputPdf: string, outputPdf: string, chunks: Record < number, number[][] > ) {
try {
const existingPdfBytes = await fs.readFileSync(inputPdf);
const sourcePDF = await PDFDocument.load(existingPdfBytes);
const croppedPages = sourcePDF.getPages();
const newDoc = await PDFDocument.create();
const MARGIN = 30;
const CHUNK_SPACING = 10;
let croppedPageIndex = 0;
for (const [pageNumStr, chunkRanges] of Object.entries(chunks)) {
if (chunkRanges.length === 0) continue;
console.log(`\n=== Stacking ${chunkRanges.length} chunks from original page ${pageNumStr} ===`);
const {
width: pageWidth,
height: pageHeight
} = croppedPages[croppedPageIndex].getSize();
let outputPage = newDoc.addPage([pageWidth, pageHeight]);
let currentY = pageHeight - MARGIN;
for (let i = 0; i < chunkRanges.length; i++) {
if (croppedPageIndex >= croppedPages.length) break;
const croppedPage = croppedPages[croppedPageIndex];
const {
width: chunkWidth,
height: chunkHeight
} = croppedPage.getSize();
const tempDoc = await PDFDocument.create();
const [tempPage] = await tempDoc.copyPages(sourcePDF, [croppedPageIndex]);
tempDoc.addPage(tempPage);
const [embeddedChunk] = await newDoc.embedPdf(tempDoc, [0]);
const scaleFactor = (pageWidth - MARGIN * 2) / chunkWidth;
const drawHeight = chunkHeight * scaleFactor;
if (currentY - drawHeight < MARGIN) {
console.log('Creating overflow page');
outputPage = newDoc.addPage([pageWidth, pageHeight]);
currentY = pageHeight - MARGIN;
}
outputPage.drawPage(embeddedChunk, {
x: MARGIN,
y: currentY - drawHeight,
width: chunkWidth * scaleFactor,
height: drawHeight
});
console.log(`✓ Stacked chunk ${croppedPageIndex + 1}`);
currentY -= drawHeight + CHUNK_SPACING;
croppedPageIndex++;
}
}
const pdfBytes = await newDoc.save();
await fs.writeFileSync(outputPdf, pdfBytes);
console.log(`\n Successfully created: ${outputPdf}`);
} catch (error) {
console.error('Error in StackPages:', error);
throw error;
}
}

Подробнее здесь: https://stackoverflow.com/questions/798 ... instead-of
Мобильная версия