如何在 TypeScript 中转换 PDF 文档

如何在 TypeScript 中转换 PDF 文档

本指南展示了如何使用 Aspose.PDF FOSS 为 TypeScript 将 PDF 内容转换为其他格式。Page 将单页导出为 SVG 或光栅图像;Document 将整个文件导出为 HTML、Markdown 或 DOCX,并且能够验证并将文档转换为 PDF/A。它需要 Node.js 22 或更高版本。

分步指南

步骤 1:安装软件包

git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-TypeScript.git
cd Aspose.PDF-FOSS-for-TypeScript
npm install
npm run build

通过在新的 TypeScript 文件中导入 Document 类来验证安装——一旦软件包安装完成,此行应当能够无错误地解析:

import { Document } from '@asposefoss/pdf';

步骤 2:导入所需类

导入 Document 打开文件;下面使用的转换方法直接在返回的 Document 和 Page 实例上调用,因此无需进一步导入:

import { Document } from '@asposefoss/pdf';

步骤 3:将页面转换为 SVG 或光栅图像

Page.ToSvg() 返回一个独立的 <svg> 字符串。Page.ToImage() 将页面渲染为光栅字节;scale 相对于 PDF 原生的 72 DPI,因此 scale: 2 在 144 DPI 下渲染:

import { Document } from '@asposefoss/pdf';

const doc = Document.OpenFile('input.pdf');
const svg = doc.Pages[0].ToSvg(); // standalone <svg> string
const png = doc.Pages[0].ToImage({ scale: 2 }); // Uint8Array of PNG bytes @144 DPI

步骤 4:将文档转换为 HTML 或 Markdown

Document.ToHtml() 在默认(语义)模式下会将结构树中的内容重新流动为标题和段落;传入 { mode: 'fixed' } 可改为将每页重新生成定位的 SVG 和绝对定位的文本。Document.ToMarkdown() 为整个文档生成 GFM Markdown:

const semanticHtml = doc.ToHtml(); // reflowable markup, all pages
const fixedHtml = doc.ToHtml({ mode: 'fixed', fonts: 'embed' }); // positioned, fonts embedded
const markdown = doc.ToMarkdown(); // GFM Markdown, all pages

语义模式读取由 Document.GetStructTree() / Document.CreateStructTree() 构建的结构树——在未标记的文档上,它会回退到启发式主体,导出时会失去标题结构。


步骤 5:将文档转换为 DOCX

Document.ToDocx() 返回包含已重新流动内容和内部打包图像的 .docx 字节;传入 { mode: 'textbox' } 可保留每页自己的固定几何形状而不是重新流动:

const docx = doc.ToDocx(); // .docx bytes, reflowed, images in the package
const fixed = doc.ToDocx({ mode: 'textbox' }); // .docx keeping each page's own geometry

第6步:验证并转换为 PDF/A

Document.ValidatePdfA(level)、Document.ValidatePdfX(level) 和 Document.ValidatePdfUa() 返回一个 ValidationReport,描述文档是否符合指定标准。Document.ConvertToPdfA(level, opts) 返回一个 ConversionReport,列出它所应用的修复以及仍未解决的问题。当现场文档必须保持未转换保存时,请在 Document.ExtractPages() 副本上运行转换:

const report = doc.ValidatePdfA('2b');
console.log(report.Passed);

const copy = doc.ExtractPages(doc.Pages.map((_, i) => i + 1));
const conversion = copy.ConvertToPdfA('2b');
console.log(conversion.applied.length, conversion.unresolved.length, conversion.passed);
copy.Save();

常见问题与修复

Document.ToHtml() 失去标题结构。 语义模式遍历结构树,因此必须在标记阶段之后运行——可以是 Document.AutoTag() 或通过手工编写的标记 StructTreeRoot.Append(). ToHtml() 当 … 时回退到启发式主体 GetStructTree() returns null.

ConvertToPdfA() 更改了您本意保持未转换的文件。 在来自 … 的副本上运行转换 Document.ExtractPages(),然后将副本单独保存—— ConvertToPdfA() 会修改其被调用的文档。

ValidatePdfA() 首次运行时报告失败。 常见原因是未嵌入的标准字体以及缺少 /OutputIntent — 检查 report.Passed 以及各个规则的发现,以查看哪些条件未满足。

Page.ToImage() 输出看起来分辨率低。 scale 相对于 72 DPI;将其提高(例如 { scale: 2 } 对于 144 DPI)以获得打印质量的输出。

常见问题

语义和固定 HTML 导出之间有什么区别?

语义模式会根据文档的结构树重新排版为在任何宽度下浏览器都能良好阅读的标记。固定模式则将每页重新生成定位的 SVG 和绝对定位的文本,精确匹配原始布局。

Document.ToDocx() 是否保留原始页面布局?

默认情况下,ToDocx() 会重新排版内容。传入 { mode: 'textbox' } 则保留每页自身的固定几何形状。

在转换文档之前,我如何检查文档是否满足 PDF/A?

调用 Document.ValidatePdfA(level)(例如 '2b'),并检查返回的 ValidationReport——它会报告当前状态而不修改文档。

我可以只转换部分页面吗?

是的 — 首先使用 Document.ExtractPages() 构建子集 Document,然后在该子集上调用转换方法(ToHtml()、ToDocx()、ConvertToPdfA(),等等)。

另请参阅

 中文