Pdf-lib: Как объединить обрезанные фрагменты страниц PDF обратно на одну страницу вместо создания скрытых полных страницJavascript

Форум по Javascript
Ответить
Anonymous
 Pdf-lib: Как объединить обрезанные фрагменты страниц PDF обратно на одну страницу вместо создания скрытых полных страниц

Сообщение Anonymous »

[простое веб-приложение для разбивки PDF-файлов][1] [1]: https://i.sstatic.net/xPVIcsiI.png
Я использую пакет 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»