Android使用PdfDocument生成PDF时文本不自动换行如何解决
问题现象:生成的PDF文本横向超出边界不自动换行
问题根本原因
Android 原生Canvas.drawText()方法没有内置文本边界检测、自动换行逻辑,传入的文本会按单行绘制超出页面边界,该现象和PdfDocument本身无关。
解决方案:使用StaticLayout实现自动换行排版
StaticLayout是Android官方提供的多行文本排版组件,会自动根据给定的最大宽度折行,支持自定义行间距、对齐方式,兼容多版本的实现代码如下:
// 原有基础初始化逻辑(和你的现有代码兼容) Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setTextSize(14); // 可自定义文本大小,单位和页面尺寸一致为磅 paint.setColor(Color.BLACK); PdfDocument pdfDocument = new PdfDocument(); PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder((int) 585, 842, 1).create(); PdfDocument.Page mypage1 = pdfDocument.startPage(pageInfo); Canvas canvas = mypage1.getCanvas(); // 新增文本边界和排版逻辑 int padding = 30; // 页面边距,可自行调整 int availableTextWidth = 585 - padding * 2; // 文本最大可用宽度 String targetContent = "你需要写入PDF的长文本内容,支持任意长度自动折行"; StaticLayout textLayout; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { textLayout = StaticLayout.Builder.obtain(targetContent, 0, targetContent.length(), paint, availableTextWidth) .setAlignment(Layout.Alignment.ALIGN_NORMAL) .setLineSpacing(1.2f, 1.0f) // 行间距参数可自行调整 .setIncludePad(false) .build(); } else { // 兼容API 23以下版本 textLayout = new StaticLayout(targetContent, paint, availableTextWidth, Layout.Alignment.ALIGN_NORMAL, 1.2f, 1.0f, false); } // 绘制文本到Canvas canvas.save(); canvas.translate(padding, padding); // 移动绘制起点到边距位置 textLayout.draw(canvas); canvas.restore(); // 完成页面绘制,后续写入文件逻辑保持不变 pdfDocument.finishPage(mypage1);
超长文本分页补充说明
如果文本总高度超过当前页面可绘制高度,可通过textLayout.getHeight()获取文本总高度,计算每页可承载的内容量,截断文本后新建页面继续绘制即可。
内容的提问来源于stack exchange,提问作者مكتبة الأفق للخدمات العلمية
相关产品推荐
相关产品推荐


