使用pdfjs拆分PDF加中文水印后文本显示不全问题求助
解决PDF拆分+中文水印后文本显示不全的问题
针对你遇到的问题,结合指定依赖版本,可从以下几个方向排查修复:
1. 确认PDF.js的CMap配置是否完全正确
即便已将CMap放入静态资源,仍需确保初始化PDF.js时精准指定CMap路径:
import * as pdfjsLib from 'pdfjs-dist'; import 'pdfjs-dist/build/pdf.worker.entry'; // 配置CMap路径与工作线程 pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdf.worker.js'; pdfjsLib.DefaultOptions.cMapUrl = '/static/cmaps/'; // 对应你的静态资源目录路径 pdfjsLib.DefaultOptions.cMapPacked = true; // 若使用官方打包的CMap文件需开启此项
注意:直接从node_modules/pdfjs-dist/cmaps目录完整复制CMap文件到静态资源,不要自行修改、压缩或删减文件。
2. 修复PDF-Lib添加中文水印的字体嵌入逻辑
PDF-Lib默认不支持中文字体,必须手动嵌入完整的中文字体文件(如思源黑体、宋体等):
import { PDFDocument, rgb } from 'pdf-lib'; async function addChineseWatermark(pdfBytes, fontBytes) { const pdfDoc = await PDFDocument.load(pdfBytes); // 嵌入自定义中文字体 const chineseFont = await pdfDoc.embedFont(fontBytes); const pages = pdfDoc.getPages(); pages.forEach(page => { const { width, height } = page.getSize(); // 使用嵌入字体绘制中文水印 page.drawText('中文水印示例', { x: width / 2 - 60, y: height / 2 - 18, size: 28, font: chineseFont, color: rgb(0.6, 0.6, 0.6), opacity: 0.4, }); }); return await pdfDoc.save(); }
注意:字体文件需放在静态资源目录,同时在vue.config.js中配置字体文件的loader规则,避免Webpack错误处理字体资源。
3. 调整Webpack对PDF相关资源的处理规则
Webpack可能误压缩或修改CMap、PDF文件,需在vue.config.js中添加排除规则:
module.exports = { configureWebpack: { module: { rules: [ { test: /\.pdf$/, use: [{ loader: 'file-loader', options: { name: '[name].[ext]' } }] }, { test: /\.(cmap|cmapx)$/, use: [{ loader: 'file-loader', options: { name: 'cmaps/[name].[ext]' } }] } ] } } };
确保CMap和PDF文件被当作纯静态资源处理,不被Webpack进行代码压缩或转译。
4. 检查拆分PDF时的内容完整性
使用PDF.js拆分页面时,需确保完整复制页面资源,避免遗漏字体信息:
async function splitPDF(pdfBytes, targetPageNumbers) { const sourcePdf = await pdfjsLib.getDocument({ data: pdfBytes }).promise; const newPdf = await PDFDocument.create(); for (const pageNum of targetPageNumbers) { // 注意PDF.js的页码从0开始 const [copiedPage] = await newPdf.copyPages(sourcePdf, [pageNum - 1]); newPdf.addPage(copiedPage); } return await newPdf.save(); }
注意:确保PDF.js与PDF-Lib的API调用匹配,你当前使用的版本兼容性较好,避免跨版本的错误调用。
5. 排除原PDF文件本身的问题
部分原始PDF可能存在字体嵌入不全、损坏的情况,可尝试用标准的带中文的PDF文件测试,确认问题是否来自原文件。
内容的提问来源于stack exchange,提问作者Jerry Don
相关产品推荐
相关产品推荐

