使用基于PDF文档/画布大小的Android PDF文档设置文本大小

时间:2015-12-14 00:09:05

标签: android pdf canvas

我正在尝试使用Android PDFDocument类将LinearLayout转换为PDF。我将布局扩展为ViewGroup,将视图缩放到画布,然后绘制到画布上。我正在成功制作PDF,但字体大小是根据设备分辨率/密度而不是PDF大小绘制的。基本上,字体最终在实际PDF上很大。我相信这是由于视图是关于设备屏幕的尺寸和密度绘制的,然后转换为画布。

我已经尝试在px和pt中设置尺寸,但我似乎无法做到正确。当尺寸设置得非常小(1-2dp或px)时,字体会显示正确的大小,但我知道在不同的设备上运行时我会遇到问题。

缩放文本和查看尺寸的最佳方法是什么,以便它们在最终PDF上显示适当的大小(300 dpi时大约12pt字体)?我是否需要从设备屏幕中提取某种尺寸,然后根据设备和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's 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);

3 个答案:

答案 0 :(得分:0)

我发现这也是我的PDF文档的问题。因此,我没有在画布上绘制视图,而是创建了一个TextPaint对象,并使用了canvas.drawtext(“string”,x-position,y-position,textPaint)方法。

答案 1 :(得分:0)

尝试canvas.setDensity(72),因为它适用于位图? 见here

或者使用72作为PrintAttributes.Resolution

答案 2 :(得分:0)

为任何问题致歉,因为这是我的第一篇SO文章!我通过按如下所示缩放画布来解决了这个问题(尽管使用了PrintDocumentAdapter提供的PdfDocument),其中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,其中包含几个TextViewWRAP_CONTENTUNSPECIFIED允许视图采用正确的高度并正确打印,无论如何我还是这样。