Почему изображение повреждено в PDF-ридере, но нормально в браузере?

У меня проблемы с пониманием и, следовательно, с решением следующей проблемы. Я создаю динамический PDF-файл, используя рисунки, шрифты и изображения, используя структуру Zend (Zend_Pdf). Проблема с изображениями. Я вставляю JPG без сжатия, но он всегда искажается в Adobe PDF Reader. Я пытался использовать другое значение DPI изображения, масштабировал и сохранял изображение перед встраиванием или сохранял исходный размер и масштабировал его только при встраивании в PDF, но результаты те же. Я действительно не понимаю, что не так или что еще я мог бы попробовать, поэтому я буду благодарен за любую помощь.

Изображение вставлено в PDF (оригинал здесь):

изображение, вставленное в PDF

Когда я открываю PDF-файл в любом браузере (Chrome, FF, IE), он выглядит нормально, но в программе для чтения Adobe PDF я получаю следующее:

скриншот из программы чтения PDF

Я отметил поврежденные места. test.pdf можно посмотреть здесь. Может ли кто-нибудь помочь мне понять проблему?

ИЗМЕНИТЬ

После дальнейшей отладки это, похоже, связано с размером изображения и методом Zend_Pdf::drawImage().

Ожидаемый размер изображения в PDF должен быть примерно 168x120 пикселей на основе предоставленных мной координат, однако фактический размер в PDF намного больше. Разница около 35%.

Я считаю, что изображение повреждено, но я до сих пор не понимаю, какие координаты я должен использовать, чтобы отобразить нужный размер пикселя... В основном я использую этот шаблон:

$page->drawImage($image, $x, ($y - 120), ($x + 168), $y);

Это неправильный способ вычисления координат?

РЕДАКТИРОВАТЬ 2:

Я также добавляю пример уже масштабированного изображения, встроенного в PDF с использованием его фактического размера (168x120 пикселей), чтобы показать, что размер изображения внутри PDF отличается или, по крайней мере, кажется, что он не имеет ожидаемого размера, хотя я использую код выше. Масштабированное изображение находится здесь, а окончательный PDF-файл — здесь. Это масштабированное изображение уже имело белую рамку до изменения размера, поэтому результат выглядит лучше.

ИЗМЕНИТЬ 3:

Чтобы уточнить желаемый размер изображения в пикселях внутри PDF. Есть макет, которому я должен следовать из-за печати. Спецификация макета указана в мм, и у меня есть точные области, где изображения должны быть расположены, и максимальная ширина/высота. т.е. максимальная ширина составляет 100 мм, что я рассчитал как 280 пикселей в документе с разрешением 72 пикселей на дюйм, аналогично высоте (42 мм = 119 пикселей). Также существует требование, чтобы встроенные изображения имели разрешение 300 DPI. И я думаю, что может быть проблема, но я все еще не понимаю, как мне пересчитать ширину/высоту в пунктах для PDF? Также рекомендуется вставлять большое изображение и рисовать его меньше или использовать масштабированное изображение и рисовать в его реальном размере? Я видел немного лучшие результаты на экране с изображениями с использованием 72DPI, поэтому возможно ли, что мне нужно будет создать 2 файла PDF, один только для печати и один только для экрана или браузера?

РЕДАКТИРОВАТЬ 4 (печать):

Я тестировал с печатью в 300 и 600 DPI. PDF-файл с полноразмерным изображением, масштабируемым при рисовании в PDF (этот ) нормально в обоих случаях. scaled.pdf очень плохо печатается с разрешением 300 DPI (даже немного красного цвета). видно по краям). Это вполне нормально для печати с разрешением 600 DPI, но очень размыто из-за растяжения. А растяжение вызвано неправильным размером точки изображения при рисовании, как я упоминал ранее.


person lp1051    schedule 24.04.2014    source источник
comment
Я думаю, что это просто артефакты алгоритма сглаживания инструментов Adobe.   -  person Bobrovsky    schedule 24.04.2014
comment
Я вижу то же самое в Apple Preview (правда, не самая надежная программа для просмотра PDF). Справедливости ради: после извлечения файла JPEG и его просмотра в разумном размере — меньшем, чем 100% — предварительный просмотр также показывает артефакты. Возможно, это поможет рендереру, если вы включите вокруг него белую рамку в 1 или 2 пикселя.   -  person Jongware    schedule 25.04.2014
comment
Да, спасибо за подсказку. Я забыл упомянуть, что добавление белой рамки в 5 пикселей вокруг изображения устранило проблемы в верхней части S и A, однако верхняя и нижняя части Y по-прежнему не очень хороши. Также я мог воспроизвести проблемы в IE и Firefox при масштабировании, поэтому я считаю, что действительно проблема в размере встроенного изображения, которое не пропорционально (не учитывает соотношение сторон)   -  person lp1051    schedule 25.04.2014
comment
Нет, встроенное изображение точно такого же размера; Я извлек JPEG для своего теста прямо из вашего PDF. Помните, что PDF не может отображать растровое изображение на 100% на вашем экране; он всегда будет передискретизировать его, чтобы подогнать «требуемые размеры» внутри PDF обратно к «масштабу для вашего экрана» (где ваш — очень относительное понятие; мой экран в 100% отличается от вашего).   -  person Jongware    schedule 25.04.2014
comment
Теперь я не уверен, как вы это имеете в виду. Когда я пытаюсь извлечь изображение, я получаю полноразмерное изображение 945x669, однако, если я увеличу масштаб до 100%, сделаю снимок и измерю размер изображения, это не 168x120 пикселей. В первом примере это не очень заметно, но при использовании уже масштабированного изображения оно растягивается в PDF, что также приводит к плохим результатам. Я приведу пример с уже масштабированным изображением как можно скорее.   -  person lp1051    schedule 25.04.2014
comment
Ни одно внутреннее измерение в PDF-файле не выражено в «пикселях»; PDF — это реальный формат данных. Масштабирование до 100 % соответствует тому, что ваше приложение для просмотра считает 100 % на вашем экране. Если вы поднесете линейку к экрану, чтобы измерить то, что должно быть 5 строк в любом PDF-файле, вы можете обнаружить, что оно немного отличается (для хороших зрителей) или больше (для ленивых зрителей).   -  person Jongware    schedule 25.04.2014
comment
Да, но координаты основаны на точках. Из документов Zend: PDF использует ту же геометрию, что и PostScript. Он начинается с нижнего левого угла страницы и по умолчанию измеряется в точках (1/72 дюйма). поэтому я подумал, что эти точки в первую очередь отвечают за размер изображения в PDF. Если я не использую размер изображения, а вместо этого использую размер изображения *0,66, я получаю гораздо лучшие результаты. Итак, должно быть что-то о координатах и ​​исходном размере изображения в пикселях, которое я встраиваю.   -  person lp1051    schedule 25.04.2014
comment
Есть макет, которому я должен следовать из-за печати. - Появляются ли артефакты также в печати? Кроме того, кажутся серые пиксели, созданные сглаживанием. Пробовали без?   -  person mkl    schedule 25.04.2014
comment
Я обновил вопрос с результатами печати. Но где найти серые пиксели? В полноразмерном изображении или в масштабированном? Также я не уверен, как предотвратить сглаживание или когда? Вы имеете в виду при изменении размера изображения или при его рисовании в PDF?   -  person lp1051    schedule 25.04.2014
comment
Вы также можете проверить настройки вашего Adobe Acrobat/Reader. Есть настройка, в которой можно установить разрешение экрана. В настоящее время это, скорее всего, что-то около 108 ppi. Для эксперимента измените его на 72 ppi и посмотрите на результаты. Это также объясняет, почему вы получаете лучшие результаты, масштабируя изображение на 0,66. Хорошим компромиссом было бы масштабирование изображения (в процессоре изображений), чтобы оно получило разрешение около 108 ppi при 100% просмотре.   -  person Max Wyss    schedule 27.04.2014
comment
Да, спасибо!! Вы правы, у Acrobat есть собственный PPI для отображения, у меня он был 110ppi. Изменение значения по умолчанию на 72ppi теперь показывает правильный или ожидаемый размер изображения. Так что моя предпосылка о DPI или размере изображения неверна. Я все еще могу видеть артефакты в Acrobat и некоторых браузерах при некотором уровне масштабирования. Chrome — единственный, который может отображать любой PDF-файл на любом уровне масштабирования для меня. Так что, кажется, @Bobrovsky был прав. Я думаю, что лучше всего забыть о JPG и поддержать какой-нибудь векторный формат, если кто-то хочет как предварительно просмотреть, так и распечатать PDF с хорошими результатами...   -  person lp1051    schedule 28.04.2014


Ответы (1)


Если слово «говорить» состоит из символов, это зависит от того, как читатель (броузер, акробат, фоксит и т. д.) отображает шрифты.

Попробуйте включить шрифты в pdf, может поможет.

person zeppaman    schedule 24.04.2014
comment
ОП сказал, что это изображение, и даже дал ссылку на него. Проблема кажется не связанной с изображением, на котором действительно отображается текст. - person Jongware; 25.04.2014
comment
Вы правы, поэтому я согласен с @Bobrowsky, возможно, это просто артефакты, возможно, связанные с алгоритмом изменения размера Zend. - person zeppaman; 25.04.2014
comment
Да, именно так, как сказал @Jongware. Я показываю пример с изображением, используя только буквы, но это больше для простоты. Изображения могут содержать даже некоторую нетекстовую графику, которую я тоже не могу нарисовать сам из-за характера приложения. - person lp1051; 25.04.2014