HTML转PDF问题根源在HTML侧:乱码因wkhtmltopdf未加载中文字体且meta charset识别弱;错位因html2pdf仅截图不解析CSS;PDF含HTML标签是反向解析失败,需先验证Tagged PDF或OCR。

HTML 转 PDF 本身不会“影响”格式转换,但 HTML 的写法、编码、CSS 控制力,会直接决定 PDF 输出是否可用——乱码、错位、空白、样式丢失,几乎全是 HTML 侧的问题。
为什么 wkhtmltopdf 渲染出的 PDF 中文全是方块或问号
根本原因不是 PDF 不支持中文,而是 wkhtmltopdf 默认不加载中文字体,且对 <meta charset="UTF-8"> 的识别非常脆弱。
- 必须在 HTML 文件
<head>中显式声明:<meta charset="UTF-8">,且该标签要出现在所有<style>和<link>之前 - 必须通过
--encoding utf-8参数强制指定编码(命令行调用时) - 必须用
--font-family或 CSS@font-face显式引入一个系统已安装的中文字体(如Noto Sans CJK SC、SimSun、Microsoft YaHei),仅靠font-family: "PingFang SC"这类 macOS 字体名在 Linux 服务器上必然失败 - 如果用 Docker 运行
wkhtmltopdf,基础镜像里大概率没装中文字体——得自己apt install fonts-wqy-zenhei或挂载字体文件
html2pdf(js 库)在浏览器里导出 PDF 为啥表格错位严重
因为 html2pdf 本质是把 DOM 快照转成 canvas 再生成 PDF,它不解析 CSS 布局逻辑,只做像素级截图。一旦页面用了 position: sticky、transform、flex-wrap 或媒体查询,就极易截断或错位。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 避免使用
display: grid或复杂flex嵌套;改用语义化<table>+ 固定宽高 +table-layout: fixed - 移除所有
overflow: hidden或clip-path,它们会导致内容被裁掉 - 禁用
html2pdf的自动分页(pageBreak: { mode: ['avoid-all', 'css'] }),手动插入<div style="page-break-before: always"></div> - 导出前临时加一层 wrapper div 并设
zoom: 0.95,能缓解部分字体渲染偏移问题
PDF 文件里嵌了 HTML 标签?那是解析反向出了问题
这不是“HTML PDF”的问题,而是你正在用 OCR 或 PDF 解析工具(比如 pdfplumber、Marker)把 PDF 反向转回 HTML。此时出现 <p><span>Hello</span></p> 套叠、<br> 滥用、段落被切成 3 行 span,说明原始 PDF 没有真正文本流结构——它是扫描件、图片、或用了非标准字体嵌入。
立即学习“前端免费学习笔记(深入)”;
- 先用
pdfinfo your.pdf查看输出里是否有Tagged PDF: yes,没有就基本无法高质量还原 - 如果是扫描件,必须先过 OCR(
pytesseract+pdf2image),不能跳步直解析 - 用
Marker时,别依赖默认配置;在config.yaml中关掉skip_diagrams: false,并打开ocr_all_pages: true - 输出 HTML 后,用
BeautifulSoup清洗:合并相邻<span>、删空<p>、标准化换行符
真正难的从来不是“怎么转”,而是判断哪一环在撒谎:是 HTML 没写对、字体没配好、工具参数漏了、还是 PDF 本身就没文本。每次失败,先查 pdfinfo、再开浏览器调试 HTML 渲染、最后才动命令行参数——顺序错了,排查成本翻倍。


















