Введение

В introductory post показана базовая схема преобразования: Document.ToHtml(), Document.ToMarkdown() и Document.ToDocx(), каждый вызывается без аргументов, чтобы получить разумное значение по умолчанию. Каждый из этих методов принимает объект параметров, который изменяет фактический результат — семантическую разметку против точной пиксельной копии, перетекущий документ Word против документа, воспроизводящего точное расположение каждой страницы.

В этом посте рассматриваются эти параметры, а также направление преобразования, о котором вводный раздел не упоминает: проверка документа в соответствии со стандартами PDF/A, PDF/X и PDF/UA и приведение его к соответствию Document.ConvertToPdfA() и его аналогов.


Что включено

HTML Export: Семантический vs Фиксированный

Document.ToHtml(), вызываемый без параметров, проходит дерево структуры документа и генерирует перетекающую разметку — заголовки и абзацы, которые естественно читаются в браузере любой ширины. Этот режим зависит от предварительной разметки документа (Document.CreateStructTree() или эквивалентного прохода разметки); без дерева структуры экспорт переходит к простому эвристическому телу вместо истинной семантической разметки. Передача { mode: 'fixed', fonts: 'embed' } полностью переключает стратегию рендеринга: каждая страница становится позиционированным SVG и абсолютно размещённым текстом, при этом каждая внедряемая программка шрифта внедряется как base64 WOFF @font-face, так что страница выглядит одинаково, даже если у читателя шрифты не установлены.

// Semantic mode reflows from the structure tree, so this must run after the
// tagging pass: ToHtml falls back to a heuristic body when GetStructTree() is
// null, and the export loses its heading structure silently.
const semantic = doc.ToHtml();
const fixed = doc.ToHtml({ mode: 'fixed', fonts: 'embed' });

Эти два вывода служат разным целям: семантический HTML — то, что вам нужно для чтения или повторной публикации контента в интернете, а фиксированный HTML — то, что вам нужно, когда точный визуальный макет страницы должен сохраняться без изменений в браузере.

Экспорт Word и Vector

Document.ToDocx(), вызываемый без параметров, создает переформатированный .docx: абзацы и изображения, которые текстовый процессор может перенести и редактировать как обычный документ. Передача { mode: 'textbox' } вместо этого сохраняет геометрию каждой страницы, размещая содержимое в фиксированных текстовых блоках, а не позволяя ему переформатироваться — ближе к точной визуальной копии, чем к редактируемому документу. Page.ToSvg() рендерит одну страницу в отдельную строку <svg>, что полезно, когда нужен векторный, независимый от разрешения копия одной страницы вместо растрового изображения.

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

const doc = Document.OpenFile('in.pdf');
const svg = doc.Pages[0].ToSvg();               // standalone <svg> string
const docx = doc.ToDocx();                       // .docx bytes, reflowed, images in the package
const fixed = doc.ToDocx({ mode: 'textbox' });   // .docx keeping each page's own geometry

Проверка и преобразование в PDF/A, PDF/X и PDF/UA

Document.ValidatePdfA(), Document.ValidatePdfX() и Document.ValidatePdfUa() проверяют документ против отобранного, машинно-проверяемого подмножества соответствующего стандарта — PDF/A (ISO 19005) для долгосрочного архивирования, PDF/X (ISO 15930) для печатного производства и PDF/UA (ISO 14289-1) для доступности — и возвращают ValidationReport с флагом Passed, суммирующим результат. Document.ConvertToPdfA() (и эквивалентный ConvertToPdfX()/ConvertToPdfUa()) пытаются исправить документ до этого уровня, затем повторно проверяют, возвращая ConversionReport, в котором перечислены фактически применённые действия и оставшиеся нерешённые проблемы.

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

const doc = Document.OpenFile('in.pdf');
const pdfa = doc.ValidatePdfA('2b');
console.log(`validate: PDF/A-2b ${pdfa.Passed ? 'passes' : 'fails'}`);

// Conversion runs against a copy: the live document is still saved
// unconverted, so ConvertToPdfA must never touch it directly.
const pages = doc.Pages;
const allPages: number[] = [];
for (let i = 1; i <= pages.length; i++) allPages.push(i);
const copy = doc.ExtractPages(allPages);
const conversion = copy.ConvertToPdfA('2b');

console.log(`pdf/a convert: ${conversion.applied.length} action(s) applied, `
  + `${conversion.unresolved.length} unresolved`);
console.log(`result: ${conversion.passed ? 'passes' : 'still fails'} PDF/A-2b`);

Гарантировать, что преобразование достигнет полной совместимости за один проход, нельзя — распространённые причины оставшихся ошибок включают не встроенные шрифты и отсутствие целевого назначения вывода, оба из которых отображаются в conversion.unresolved.


Быстрый старт

Установите пакет, затем отрендерьте одну страницу в SVG, а весь документ — в переформатированный HTML и DOCX:

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
import { Document } from '@asposefoss/pdf';

const doc = Document.OpenFile('in.pdf');

const svg = doc.Pages[0].ToSvg();   // standalone <svg> string
const html = doc.ToHtml();          // reflowable HTML (falls back without a structure tree)
const docx = doc.ToDocx();          // .docx bytes, reflowed, images in the package

// fs.writeFileSync('page1.svg', svg);
// fs.writeFileSync('out.html', html);
// fs.writeFileSync('out.docx', docx);

Поддерживаемые форматы

ФорматРасширениеЧтениеЗапись
PDFpdf
Markdownmd
SVGsvg
TIFFtiff
DOCXdocx
HTMLhtml
PNGpng
EPUBepub

Открытый исходный код и лицензирование

Aspose.PDF FOSS для TypeScript выпущен под лицензией MIT, с исходным кодом, опубликованным на GitHub. Нет водяного знака оценки, ограничения использования или отдельного лицензионного файла для управления, и библиотеку можно использовать в коммерческих продуктах без royalty.

Пакет в настоящее время имеет версию 0.1.0, что отражает активную разработку на ранней стадии. Node.js (>=22) является единственным требованием к среде выполнения, и у пакета нет других сторонних зависимостей.


Начало работы

Связанные ресурсы