当前位置: 首页 > news >正文

PDF 组件里文字没渲染出来,只显示了线条(或者空白)

PDF 组件里文字没渲染出来,只显示了线条(或者空白),但浏览器直接打开完全正常,这是 Vue3 中 PDF.js 系列组件非常典型的问题。

方案 1:修复中文字体渲染(必试)

这是 90% 中文字体不显示问题的解决方法。

1. 配置 PDF.js 的字体映射

如果你用的是vue3-pdf-app,它底层依赖 PDF.js,可以直接配置字体:

<template> <div style="height: 800px;"> <vue3-pdf-app :src="pdfUrl" /> </div> </template> <script setup> import { Vue3PdfApp } from 'vue3-pdf-app' import 'vue3-pdf-app/dist/index.css' import pdfjsLib from 'pdfjs-dist/build/pdf' import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry' // 关键:配置 worker 和字体 pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorker // 开启字体解析(针对中文) pdfjsLib.disableWorker = false pdfjsLib.cMapUrl = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@3.4.120/cmaps/' pdfjsLib.cMapPacked = true const pdfUrl = '你的PDF地址' </script>
2. 后端生成 PDF 时嵌入字体(根治方案)

最彻底的解决方法是在后端生成 PDF 时,把中文字体嵌入进去,这样前端无论用什么阅读器都能正常显示。

  • Java iText:FontFactory.register("simhei.ttf");并设置BaseFont.EMBEDDED
  • Puppeteer:确保 PDF 使用的字体在服务器上存在,或使用系统字体
  • Wkhtmltopdf:添加--enable-local-file-access并指定字体路径

方案 2:改用 iframe 预览(最快验证+兜底方案)

如果不想折腾字体问题,直接用浏览器原生的 iframe,100% 兼容中文字体,不会出现渲染问题:

<template> <iframe :src="pdfUrl" width="100%" height="800px" frameborder="0" /> </template> <script setup> const pdfUrl = '你的PDF地址' </script>

✅ 优点:零依赖、零配置、永远兼容中文字体
❌ 缺点:无法自定义样式、工具栏有限


方案 3:检查后端响应头

让后端确认返回的 PDF 响应头包含以下内容:

Content-Type: application/pdf Content-Disposition: inline; filename="report.pdf" Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, OPTIONS

如果是 Spring Boot 后端,可以这样配置:

@GetMapping("/api/pdf")publicResponseEntity<Resource>getPdf(){// ... 读取文件流HttpHeadersheaders=newHttpHeaders();headers.setContentType(MediaType.APPLICATION_PDF);headers.setContentDispositionFormData("inline","report.pdf");returnnewResponseEntity<>(resource,headers,HttpStatus.OK);}

http://www.gsyq.cn/news/1406726.html

相关文章:

  • ROS2 Foxy下,用C++搞定六轴IMU数据解析与Rviz2实时姿态显示的完整流程
  • 开发侧如何通过Taotoken实现API Key的精细化管理与审计
  • 3分钟搞定:Mac免费读写NTFS硬盘的终极指南
  • MPU6050避坑指南:从I2C地址冲突到数据漂移,新手最常踩的5个坑
  • 合肥白蚁防治公司|合肥专业灭白蚁认准净安虫控,无损治蚁+超长质保防复发 - 资讯纵览
  • 3天搭建本地缠论量化系统:告别手工画线,拥抱自动分析新纪元
  • 气象数据处理实战:用CDO和grib_copy搞定GRIB文件合并与格式转换(附避坑要点)
  • pot-desktop跨平台翻译工具终极指南:15种语音朗读功能深度解析
  • 【小白也能学会】企业微信机器人关联 OpenClaw 配置方法(包含安装包)
  • 深度解析:C 语言中的内存对齐与边界安全
  • 新唐NUC980从SPI/NAND启动切换到SD卡启动:u-boot配置与设备树修改实战
  • 排版这么这么好看的网络工具箱离线版,谁能不爱,这两天又有优化
  • Java 面试高频:反射机制与异常体系全面解析
  • 2026年溶解氧检测仪信誉与价值评估:从口碑积累到性价比的技术解读 - 品牌推荐大师1
  • 一年制硕士的时间线极限管理:如何做到“入学前”就拿到第一轮面试?
  • 对比官方价格,Taotoken的Token Plan套餐优惠力度实测
  • 主板南北桥芯片:从核心枢纽到外围管家,一文读懂其协同与分工
  • ROS多机协同实战:从零搭建主从机通信网络
  • GitHub加速终极指南:三分钟解决访问缓慢和图片加载问题
  • PvZ Toolkit:重新定义植物大战僵尸游戏体验的开源工具箱
  • SigmaStudio调音实战:用ADAU1701的16个EQ滤波器例程,手把手教你调出专业级音效
  • 多速率WLAN性能异常与DR/GDR算法:从随机竞争到确定性预约的演进
  • 开源社区如何重塑机器人行业:协作与共享创新的力量
  • 认知无线电中抗攻击的主用户流量估计:差分报告与矩估计法
  • ESP-IDF V5.0 + Ubuntu 22.04 on WSL2:一次配好不折腾的完整记录
  • 【限时公开】ChatGPT知识问答SOP手册(含医疗/法律/编程三大垂直领域校验清单)
  • AI代理支付信任网关:基于ECDSA签名与动态信用评分的Fail-Closed架构
  • Microchip SAM D51与LAN9252的PCB布局避坑指南:信号完整性、电源噪声与未使用引脚处理
  • 元驶人:元气满满地一路前行,向身边每个人传递正能量,就像在驾驶一辆充满元气的车,不断释放能量。
  • RuoYi框架集成Swagger:从零构建优雅的API接口文档