Я использую пакет pdf-lib npm для обрезки PDF-файлов и управления ими.
Моя цель:
- Элемент списка.
- Обрезка нескольких горизонтальных фрагментов с каждой страницы.
- Повторно экспортируйте эти фрагменты.
- Сложите их обратно на одну страницу, которая имеет тот же размер, что и исходный PDF-файл.
Я создал небольшой веб-интерфейс, который позволяет мне визуально обрезать PDF-файл на горизонтальные фрагменты.
На стороне сервера я извлекаю эти фрагменты и экспортирую их как отдельные PDF-страницы. Эта часть работает нормально.
Однако я заметил, что pdf-lib, похоже, читает/обрезает страницы снизу → сверху, поэтому мне пришлось вручную изменить порядок полей обрезки, чтобы сделать экспортированные страницы читабельными.
Сейчас мои выходные данные выглядят так:
[вывод предыдущей функции][1] [1]: https://i.sstatic.net/FLTK7TVo.png
Каждый обрезан фрагмент становится отдельной страницей в экспортированном PDF-файле
Это работает так, как ожидалось
Чего я пытаюсь достичь
Вместо того, чтобы создавать несколько страниц (по одной на фрагмент), я хочу:
Таким образом, результатом должна быть восстановленная страница, состоящая из обрезанных «фрагменты».
Проблема
Когда я пытаюсь это сделать, я сталкиваюсь с ограничением с помощью page.setCropBox():
Он на самом деле не удаляет содержимое страницы
Он просто скрывает часть страницы
Когда я копирую эту страницу в другой документ, вся исходная страница все еще существует за ней
Поэтому, когда я пытаюсь «сложить» обрезанные фрагменты на одну страницу, каждый скопированный страница по-прежнему содержит весь скрытый контент.
Это делает невозможным правильное перестроение/сложение фрагментов.
** Мой текущий код **
Код: Выделить всё
export async function StackPages(inputPdf: string, outputPdf: string, chunks: Record) {
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;
}
}
это выглядит так:
[![вывод функции][1]][1][1]: https://i.sstatic.net/fOqvto6t.png
если кто-то может помочь или помочь, я все уши
Подробнее здесь: https://stackoverflow.com/questions/798 ... instead-of
Мобильная версия