TXT 文件到处都是——导出的日志、从 Word 粘出来的正文、系统批量生成的报告。要发给别人看,通常得先转成 PDF:TXT 没有版式和纸张的概念,一屏到底,同一份文件在不同设备、不同编辑器里看到的样子都不一样。过去要么用桌面软件打开另存,要么把文件传到服务端转换——前者嵌不进 Web 流程,后者则意味着文档离开了用户的设备。
本文介绍用 Spire.PDF for JavaScript 实现将 TXT 文本转换为 PDF。它基于 WebAssembly 在浏览器端直接生成并保存 PDF 文档,转换全过程在本地完成,通过虚拟文件系统(VFS)读写文件,无需后端配合。
有关安装和项目配置,请参考 React 项目中集成 Spire.PDF for JavaScript。以下示例默认已安装 Spire.PDF 并完成 WebAssembly 模块初始化。
将 TXT 文本转换为 PDF
Spire.PDF for JavaScript 提供 PdfTextWidget,用于把一整段纯文本放进 PDF 页面。字体、行距与对齐交给 PdfStringFormat;文本排满当前页时,再由 PdfTextLayout 自动换行、自动开新页,长篇 TXT 不必自己计算分页位置。
function App() {
const convertTxtToPdf = async () => {
// 获取 Spire.PDF WASM 模块
const pdfModule = window.wasmModule?.spirepdf;
// 检查模块是否就绪
if (!pdfModule) {
alert('Spire.PDF is not ready yet');
return;
}
// 文本含中文,先把含中文字形的字体放进虚拟文件系统
await window.spire.FetchFileToVFS('SIMSUN.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
// 将待转换的 TXT 文件载入 VFS
const inputFileName = '产品介绍.txt';
await window.spire.FetchFileToVFS(inputFileName, "", `${process.env.PUBLIC_URL}/data/`);
// 从 VFS 读出 TXT 字节并解码为字符串
const textBytes = window.dotnetRuntime.Module.FS.readFile(inputFileName);
const text = new TextDecoder('utf-8').decode(textBytes);
// 创建文档、节与页面
let doc = new pdfModule.PdfDocument();
let section = doc.Sections.Add();
let page = section.Pages.Add();
// 正文用嵌入的 TrueType 字体,并设置行距与左对齐
let font = new pdfModule.PdfTrueTypeFont({ fontFile: '/Library/Fonts/SIMSUN.TTF', size: 12 });
let format = new pdfModule.PdfStringFormat();
format.LineSpacing = 20;
format.Alignment = pdfModule.PdfTextAlignment.Left;
// 页内排满就换页,超出部分自动分到新页面
let textLayout = new pdfModule.PdfTextLayout();
textLayout.Break = pdfModule.PdfLayoutBreakType.FitPage;
textLayout.Layout = pdfModule.PdfLayoutType.Paginate;
// 文本从页面左上角开始排,顶部留出 20 磅
let bounds = new pdfModule.RectangleF({
location: new pdfModule.PointF(0, 20),
size: page.Canvas.ClientSize
});
// 用 PdfTextWidget 承载整段文本,交给排版引擎绘制
let textWidget = new pdfModule.PdfTextWidget({
text: text,
font: font,
brush: pdfModule.PdfBrushes.get_Black()
});
textWidget.StringFormat = format;
let layoutWidget = new pdfModule.PdfLayoutWidget(textWidget.H);
layoutWidget.Draw({ page: page, layoutRectangle: bounds, format: textLayout });
// 保存文档
const outputFileName = '产品介绍.pdf';
doc.SaveToFile(outputFileName);
doc.Close();
// 从 VFS 读取生成的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/pdf' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>将 TXT 文本转换为 PDF</h1>
<button onClick={convertTxtToPdf}>
开始转换
</button>
</div>
);
}
export default App;
转换生成的 PDF,TXT 中的长文本已按页自动排开:

常见问题
转换后中文显示成方框或空白
原因:PdfTextWidget 默认使用的 Helvetica 是 PDF 内置的西文字体,只带拉丁字形,遇到中文字符时没有可用字形,页面上的中文会显示为空白或方块。
解决:改用 PdfTrueTypeFont 载入一份含中文字形的字体文件,并先把该文件放进虚拟文件系统的 /Library/Fonts/:
// 从项目静态目录把字体读入 VFS
await window.spire.FetchFileToVFS('SIMSUN.TTF', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
// 用 fontFile 指定 VFS 中的字体路径
let font = new pdfModule.PdfTrueTypeFont({ fontFile: '/Library/Fonts/SIMSUN.TTF', size: 12 });
长文本没有自动分页,只排了一页
原因:PdfTextWidget 只在传入的矩形范围内绘制,超出范围的内容不会自己挪到下一页——是否分页由 PdfTextLayout.Layout 决定。
解决:把 PdfTextLayout.Layout 设为 PdfLayoutType.Paginate、Break 设为 PdfLayoutBreakType.FitPage,并把这个对象作为 Draw 的 format 参数传进去:
let textLayout = new pdfModule.PdfTextLayout();
textLayout.Break = pdfModule.PdfLayoutBreakType.FitPage; // 一页排满即换页
textLayout.Layout = pdfModule.PdfLayoutType.Paginate; // 自动分页
layoutWidget.Draw({ page: page, layoutRectangle: bounds, format: textLayout });
TXT 里的制表符缩进在 PDF 里对不上
原因:读出来的文本是纯字符,制表符只是一个 \t,不含“占几个字符宽”的信息。排版时所有 \t 按同一宽度处理,原文中靠 \t 或多空格对齐的缩进,到 PDF 里就对不齐了。
解决:需要精确对齐的表格类内容改用空格补足,或改走表格绘制;纯文本稿件保持原样按阅读用途输出即可。
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







