Использование поворота для изображений приводит к пустому PDF с помощью pdfkit

Я задал вопрос напрямую в репозиторий, но, по моему опыту, SO более реактивен.

Привет,

Я пытаюсь создать PDF-файл из фотографий, используя pdfkit. В зависимости от того, находится ли изображение в ландшафтном или портретном режиме, я хочу перевернуть изображение.

В основном это означает следующее (в машинописном тексте):

function toPostscriptPoint(mm: number) {
    return mm * 2.8346456693;
}
const document = new PDFDocument({
    size: [toPostscriptPoint(156), toPostscriptPoint(106)],
});

document.pipe(fs.createWriteStream('output.pdf'));

document.save();
document.rotate(90);
document.image(
            'photos/sample.jpeg',
            { width: toPostscriptPoint(150), fit: [toPostscriptPoint(150), toPostscriptPoint(100)] });
    document.restore();

document.end();

Однако происходит то, что PDF-файл отображается полностью белым. Однако я вижу, что что-то происходит, потому что pdf имеет размер входного изображения.

Поворот изображений не поддерживается? Какие могут быть возможные альтернативы? Я хотел бы избежать необходимости переписывать свои файлы, прежде чем помещать их в PDF.

Спасибо


person jlengrand    schedule 25.06.2018    source источник


Ответы (1)


Хорошо, после расследования я могу ответить на свой вопрос :).

Я мог видеть, что изображения были в формате PDF из-за размера файла, поэтому я погрузился глубже.

Случилось так, что изображение было отрисовано за пределами области просмотра. Это произошло по нескольким причинам: * По умолчанию исходной точкой страницы после поворота в pdfkit является центр страницы! (Дополнительную информацию см. в документе) * Исходная точка поворачивается вместе с преобразованием. * X и y в методе изображения на самом деле инвертированы.

Итак, после того, как все сделано правильно, следующий код показывает изображение, как и ожидалось:

function toPostscriptPoint(mm: number) {
    return mm * 2.8346456693;
}
const document = new PDFDocument({
    size: [toPostscriptPoint(156), toPostscriptPoint(106)],
});

document.pipe(fs.createWriteStream('output.pdf'));

document.save();
document.rotate(90, {origin : [0, 0]});
document.image(
            'photos/sample.jpeg',
            toPostscriptPoint(0),
            toPostscriptPoint(-150),
            { width: toPostscriptPoint(150), height: toPostscriptPoint(100) });
    document.restore();

document.end();

Обратите внимание :

  • исходный аргумент в вращении
  • toPostscriptPoint(-150) фактически учитывает исходную позицию и соответствует оси X.

Надеюсь, что это поможет некоторым позже :).

person jlengrand    schedule 27.06.2018