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

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

Сообщение Anonymous »

простое веб-приложение для фрагментации PDF-файлов
Изображение

Я использую пакет 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
Ответить

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

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

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

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

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