Установка размера текста с использованием PDF PDF-документа на основе формата PDF/холста PDF

Я пытаюсь преобразовать LinearLayout в PDF, используя класс PDF PDF Documentum. Я раздуваю макет в ViewGroup, масштабирую вид на холст и рисую на холст. У меня есть успех в создании PDF, но размер шрифта рисуется на основе разрешения/плотности устройства, а не размера PDF. По сути, шрифт становится огромным в реальном PDF. Я считаю, что это связано с тем, что View был сделан в отношении размеров и плотности экрана устройства, а затем переведен на холст.

Я экспериментировал с установкой размеров в px и pt, но я не могу понять, что это правильно. Шрифт появляется примерно в правильном размере, когда размеры заданы очень маленькими (1-2dp или px), но я знаю, что при работе на разных устройствах у меня будут проблемы.

Каков наилучший способ масштабирования текста и размеров View, чтобы они выглядели соответствующим размером в конечном PDF (приблизительно 12pt шрифт с разрешением 300 dpi)? Мне нужно будет вытащить какие-то измерения с экрана устройства, а затем изменить размер всех представлений на основе соотношения между устройством и холстом PDF?

У меня болит голова от удара от стены.

Спасибо, Энди

//Sets print options
PrintAttributes printAttrs = new PrintAttributes.Builder().
setColorMode(PrintAttributes.COLOR_MODE_COLOR).
setMediaSize(PrintAttributes.MediaSize.NA_LETTER).
setResolution(new PrintAttributes.Resolution("res1", PRINT_SERVICE, 300, 300)).
setMinMargins(PrintAttributes.Margins.NO_MARGINS).build();

//create PDF Document
PdfDocument document = new PrintedPdfDocument(context, printAttrs);
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(pageWidth, pageHeight, 1).create();


//Inflate an XML template into a view with a LinearLayout root
LinearLayout container = new LinearLayout(context);
LayoutInflater inflater = LayoutInflater.from(context);
View view = new View(context);
view = inflater.inflate(R.layout.layout_pdf_meal_template, container, true);

//Pull data/strings from SQLite
//My codes goes through and populates the data gathered from the database to the LinearLayout subviews

//create page
PdfDocument.Page page = document.startPage(pageInfo);
Canvas canvas = page.getCanvas();

//Draw view on the page
int measureWidth = View.MeasureSpec.makeMeasureSpec(canvas.getWidth(), View.MeasureSpec.EXACTLY);
int measuredHeight = View.MeasureSpec.makeMeasureSpec(canvas.getHeight(), View.MeasureSpec.EXACTLY);
container.measure(measureWidth, measuredHeight);
container.layout(0, 0, canvas.getWidth(), canvas.getHeight());


container.draw(canvas);
document.finishPage(page);

Ответ 1

Я обнаружил, что это проблема с моим PDF-документом. Поэтому вместо рисования представления на моем холсте я создал объект TextPaint и использовал метод canvas.drawtext( "string", x-position, y-position, textPaint).

Ответ 2

Попробуйте canvas.setDensity(72), поскольку он работает с растровыми изображениями? См. здесь.

Или используйте 72 для PrintAttributes.Resolution?

Ответ 3

Извиняюсь за любые проблемы, поскольку это мой первый пост на SO! Я решил эту проблему (хотя и с использованием PdfDocument, поставляемого PrintDocumentAdapter) путем масштабирования холста следующим образом, где hdpi и vdpi - это горизонтальное и вертикальное разрешение PdfDocument (в вашем случае оба равны 300, но, возможно, вы хотите больше для лучших результатов? ):

....

PrintAttributes.MediaSize pageSize = printAttributes.getMediaSize();
PrintAttributes.Resolution resolution = printAttributes.getResolution();
int hdpi = resolution.getHorizontalDpi();
int vdpi = resolution.getVerticalDpi();
int availableWidth = pageSize.getWidthMils() * hdpi / 1000;

....
content.setLayoutParams(new ConstraintLayout.LayoutParams(availableWidth, ConstraintLayout.LayoutParams.WRAP_CONTENT));

int measureWidth = View.MeasureSpec.makeMeasureSpec(availableWidth, View.MeasureSpec.EXACTLY);
content.measure(measureWidth, View.MeasureSpec.UNSPECIFIED);

content.layout(0, 0, content.getMeasuredWidth(), content.getMeasuredHeight());
canvas.scale(72f / hdpi, 72f / vdpi);
content.draw(canvas);

....

В приведенном выше content находится ConstraintLayout, который я хочу напечатать, содержащий несколько TextView. WRAP_CONTENT и UNSPECIFIED позволяют виду принимать правильную высоту и правильно печатать, в любом случае, в моем случае.