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

Android中PdfDocument生成PDF体积过大问题求助

Android中PdfDocument生成PDF体积过大的优化方案

核心原因分析

PdfDocument默认会嵌入完整的字体文件(比如系统Roboto字体),这是单页"Hello World"PDF体积接近180KB的核心原因,而非文本内容本身占用空间。

优化方案

  • 使用系统字体并限制字符嵌入子集
    明确指定系统内置字体,配置Paint仅嵌入文档实际用到的字符,避免完整字体嵌入:

    val pdfFile = File(filePathToPdfFile)
    val pdfDocument = PdfDocument()
    val pageInfo = PdfDocument.PageInfo.Builder(
        PainterPdf.pageWidth,
        PainterPdf.pageHeight,
        1
    ).create()
    
    val page = pdfDocument.startPage(pageInfo)
    val canvas = page.canvas
    
    // 配置Paint,仅嵌入用到的字符
    val paint = Paint().apply {
        typeface = Typeface.create(Typeface.SANS_SERIF, Typeface.NORMAL)
        textSize = 16f
        isSubpixelText = true
        setTextEncoding(Paint.ENCODING_UTF8)
    }
    
    canvas.drawText("Hello World!", 100f, 200f, paint)
    pdfDocument.finishPage(page)
    
    // 写入时启用GZIP压缩进一步减小体积
    FileOutputStream(pdfFile).use { fos ->
        GZIPOutputStream(fos).use { gzos ->
            pdfDocument.writeTo(gzos)
        }
    }
    pdfDocument.close()
    
  • 禁用不必要的页面冗余配置
    若无需页面旋转、边距等额外特性,跳过PageInfo的非必要配置,减少元数据占用:

    val pageInfo = PdfDocument.PageInfo.Builder(
        PainterPdf.pageWidth,
        PainterPdf.pageHeight,
        1
    ).create()
    
  • 替换轻量字体
    选用更精简的系统字体(如Typeface.MONOSPACE),或引入第三方开源轻量字体(仅嵌入所需字符),进一步压缩字体嵌入体积。

效果验证

优化后,单页"Hello World"PDF体积可降至10KB以内,恢复正常水平。

内容的提问来源于stack exchange,提问作者JohnDoe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:22:26