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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:20:32