如何从Android Studio(Java)中的视图创建高质量的PDF?

gwo2fgha  于 2023-01-19  发布在  Android
关注(0)|答案(1)|浏览(157)

我想创建一个PDF文件的线性布局我的活动之一。一个例子可以在下面找到:https://medium.com/@strawberryinc0531/convert-xml-to-pdf-in-android-studio-using-pdfdocument-class-757dee166d50
我正在创建一个位图。无论是否缩放,从位图生成的PDF文件都会导致低分辨率内容(即缩放后的PDF文件模糊不清)。我可以创建线性布局的矢量化图像来创建PDF吗?

s4n0splo

s4n0splo1#

不要缩小位图以适合PDF页面大小,请在从PDF文档获取的画布上设置比例。
这将以原始分辨率存储位图,但以适合您页面大小的正确大小显示它。因此,当您放大PDF时,它不会像素化,直到您用完原始位图中的细节。
例如:

// Prep linearLayout to draw to Bitmap
....

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

Canvas pageCanvas = page.getCanvas();
// Work out scale to use to fit width of page
// In this instance the bitmap is wider than the height
// so we don't need to work out if we need a smaller scale to fit the height on to the page
float scaleWidth = (float) pageCanvas.getWidth() / linearLayout.getWidth();

// Draw the Layout to a bitmap at it's original size
Canvas bitmapCanvas = new Canvas();
Bitmap bitmap = Bitmap.createBitmap(linearLayout.getWidth(), linearLayout.getHeight(), Bitmap.Config.ARGB_8888);

bitmapCanvas.setBitmap(bitmap);
linearLayout.draw(bitmapCanvas);

// The important bit to set the page scale
pageCanvas.scale(scaleWidth, scaleWidth);

// Draw the original sized bitmap to page
Paint paint = new Paint();
paint.setAntiAlias(true);
pageCanvas.drawBitmap(bitmap,0,0,paint);

如果你看它创建的PDF

因此,在本例中,PDF中包含的图像为1322 x 669,但它显示在594 x 841的MediaBox中,因此它具有大约2.2倍的更多细节可供放大
另一种方法是直接将您的布局绘制到PDF页面,而不需要通过位图,因为这会创建PDF“primatives”,如文本和线对象,缩放效果更好,但您必须调整布局大小以适应PDF页面大小。

相关问题