Использование поворота для изображений приводит к пустому 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.

Спасибо

2 ответа

Решение

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

Я мог видеть, что изображения были как-то в формате 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.

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

Это потому, что при съемке с камеры, если ISO изображения меньше 100, оно будет автоматически повернуто, сделайте снимок с ISO больше или равным 100, чтобы избежать автоповорота.

Другие вопросы по тегам