Android: PDF-файл, созданный с помощью PrintedPdfDocument, выглядит по-разному на разных устройствах

Я пытаюсь отобразить представление в PrintedPdfDocument. Размер страницы, как и ожидалось, указан в единицах 1/72 дюйма. Итак, для страницы формата A0 (ширина = 33,11 дюйма) document.getPageWidth() возвращает 2384 (33,11 * 72). Ширина холста страницы равна одному пикселю одной 1/72 дюйма, поэтому pageCanvas.getWidth() возвращает 2384. Это справедливо для разных устройств. Все идет нормально.

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

В чем тут может быть дело? Разве генерация PDF не должна быть независимой от устройства? Я заметил, что pageCanvas.getDensity() отличается на разных телефонах. Почему плотность экрана телефона влияет на плотность холста страницы PDF?

Учитывая, что численно document.getPageWidth() в 1/72 дюйма == pageCanvas.getWidth() в пикселях, не должно ли pageCanvas.getDensity() всегда быть 72 DPI? На некоторых телефонах это 320 (где отображается правильно), а на других - 420 (где изображение отображается растянутым).

Немного застрял здесь, поэтому был бы очень признателен за любые указатели. Заранее спасибо!


person Vijayendra Vasu    schedule 04.08.2020    source источник
comment
Это довольно подробное описание, которого может быть достаточно, но минимально воспроизводимый пример никогда не помешает.   -  person Ryan M    schedule 05.08.2020
comment
Спасибо, Райан. На самом деле в этом поведении нет никакой изменчивости — оно воспроизводимо в 100% случаев. В любом случае, я нашел ответ на свой вопрос - опубликую его ниже :)   -  person Vijayendra Vasu    schedule 10.08.2020


Ответы (1)


Я нашел способ обойти эту проблему.

Я до сих пор не знаю, почему pageCanvas.getDensity() настроен на плотность отображения, а не на плотность страницы PDF (72 точки на дюйм). Я предполагаю, что это может быть связано с тем, что некоторые представления могут неправильно использовать показатели отображения экрана при рисовании на холсте, даже если холст не является экраном, но это только мое предположение.

Независимо от того, почему pageCanvas.getDensity() настроен на плотность экрана, я работал с этим, вычисляя размеры страницы (которые указаны в dp) с использованием плотности экрана. Итак, если я хочу рисовать на странице A0 (шириной 33,11 дюйма), я устанавливаю ширину страницы (при создании PrintedPdfDocument) на 33,11 * 420 = 13906 dp вместо рекомендуемых 33,11 * 72 = 2384 dp. . Таким образом, когда представления рисуются на холсте с плотностью 420 точек на дюйм, результирующая страница имеет требуемую ширину 33,11 дюйма.

Это работает отлично, и созданная страница PDF теперь выглядит одинаково независимо от устройства, на котором она была создана. Единственным побочным эффектом является то, что Adobe Acrobat считает страницы шириной 33,11 * 420 / 72 дюйма вместо ширины 33,11 дюйма. Но на самом деле это не имеет практического значения, поскольку мы можем сжимать страницы, чтобы они соответствовали бумаге формата A0 во время печати.

person Vijayendra Vasu    schedule 10.08.2020