You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者مكتبة الأفق للخدمات العلمية

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 01:39:00