Android端生成PDF时如何将图片居中并自适应调整页面大小
问题根因
- 居中失效:iText的坐标原点为页面左下角,你之前直接将页面中心坐标作为图片的位置参数,实际是把图片的左下角放在了页面中心,自然无法实现居中效果,需要额外减去图片自身缩放后宽高的一半。
- 图片超出页面:缺少图片尺寸适配逻辑,超过页面大小的图片没有自动缩小,所以会溢出边界。
修正后代码
public void createPdf(String dest, int pageNum, int pageHeight, int pageWidth) throws IOException, DocumentException { Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream(dest)); document.open(); // 元数据全局设置一次即可,无需放到循环中重复执行 document.addAuthor("PDF Reader Osdifa's User"); document.addCreator("PDF Reader Osdifa"); document.setPageCount(pageNum); // 页面边距,可根据需求调整,避免图片贴边 float margin = 10f; for (Uri image : allSelectedImages) { Image img = Image.getInstance(image.getPath()); Rectangle pageSize = new Rectangle(pageHeight, pageWidth); document.setPageSize(pageSize); document.newPage(); // 计算页面可绘制区域的宽高(扣除边距) float availableWidth = pageSize.getWidth() - 2 * margin; float availableHeight = pageSize.getHeight() - 2 * margin; // 分别计算图片、可绘制区域的宽高比 float imgRatio = img.getWidth() / img.getHeight(); float pageRatio = availableWidth / availableHeight; // 按比例计算缩放后的图片尺寸,保证不会超出页面范围 float scaledWidth, scaledHeight; if (imgRatio > pageRatio) { // 图片宽高比大于页面,按宽度适配 scaledWidth = availableWidth; scaledHeight = scaledWidth / imgRatio; } else { // 图片宽高比小于等于页面,按高度适配 scaledHeight = availableHeight; scaledWidth = scaledHeight * imgRatio; } // 应用缩放设置 img.scaleAbsolute(scaledWidth, scaledHeight); // 计算居中坐标,原点在页面左下角 float x = (pageSize.getWidth() - scaledWidth) / 2; float y = (pageSize.getHeight() - scaledHeight) / 2; img.setAbsolutePosition(x, y); document.add(img); } document.close(); }
上述代码同时处理了居中显示和尺寸适配两个需求,无论图片尺寸大于还是小于页面,都会自动缩放后居中展示,你可以根据实际需要调整margin参数修改边距大小。
内容的提问来源于stack exchange,提问作者Syed Irfan Hussaini
相关产品推荐
相关产品推荐

