Введение
В 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 buildimport { 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);
Поддерживаемые форматы
| Формат | Расширение | Чтение | Запись |
|---|---|---|---|
| ✓ | ✓ | ||
| Markdown | md | ✓ | ✓ |
| SVG | svg | ✓ | ✓ |
| TIFF | tiff | ✓ | ✓ |
| DOCX | docx | — | ✓ |
| HTML | html | — | ✓ |
| PNG | png | — | ✓ |
| EPUB | epub | — | ✓ |
Открытый исходный код и лицензирование
Aspose.PDF FOSS для TypeScript выпущен под лицензией MIT, с исходным кодом, опубликованным на GitHub. Нет водяного знака оценки, ограничения использования или отдельного лицензионного файла для управления, и библиотеку можно использовать в коммерческих продуктах без royalty.
Пакет в настоящее время имеет версию 0.1.0, что отражает активную разработку на ранней стадии. Node.js (>=22) является единственным требованием к среде выполнения, и у пакета нет других сторонних зависимостей.