Ядро API
Основне API
У цьому посібнику показано, як відкривати, редагувати, збирати та зберігати PDF-документи за допомогою класів Document та Page — точок входу для кожної операції у Aspose.PDF FOSS для TypeScript. Document завантажує, створює, збирає та зберігає цілі PDF-файли; Page, доступний через doc.Pages, надає операції над текстом, зображенням, анотаціями та потоками вмісту на рівні сторінки.
Життєвий цикл документа
Document.OpenFile() відкриває PDF за шляхом до файлу; Document.Open() приймає Uint8Array у пам’яті. Сторінки можна переглядати та редагувати на місці, а Document.WriteTo() записує результат назад — за бажанням із стисканням xref-stream та object-stream.
import { Document } from '@asposefoss/pdf';
// Open from disk (or Document.Open(uint8array) for in-memory data)
const doc = Document.OpenFile('input.pdf');
// Inspect and edit pages
const pages = doc.Pages;
console.log(pages.length);
pages[0].Rotate = 90;
doc.RemovePage(2); // 1-based page number
doc.Reorder([3, 1, 2]);
// Metadata
doc.SetMetadata({ title: 'Report', author: 'Jane', custom: { Dept: 'R&D' } });
// Save
doc.WriteTo('output.pdf'); // or: const bytes = doc.Save();
doc.WriteTo('small.pdf', { compressed: true }); // xref stream + object streams
Розділення, об’єднання та вилучення сторінок
Document.Split() повертає один Document на сторінку. Document.ExtractPages() приймає список сторінок, нумерація з 1, допускаючи повтори, і повертає новий Document лише з цими сторінками. Document.Append() та Document.InsertPage() копіюють сторінки між документами, а Document.Merge() об’єднує кілька документів в один.
const parts = doc.Split(); // one Document per page
const chapter = doc.ExtractPages([3, 4, 5]); // subset (1-based, repeats allowed) as a new Document
docA.Append(docB); // copy all of docB's pages onto docA
docA.InsertPage(1, docB.Pages[0]); // copy a single page across documents
Створення нового документа
Document.New() створює порожній документ у заданому PageFormat. Page.AddText() розташовує позиційований текст, а Document.AddPage() додає інші сторінки, включаючи повернутий формат, такий як PageFormat.A4.landscape().
import { Document, PageFormat } from '@asposefoss/pdf';
const doc = Document.New(PageFormat.A4); // one blank A4 page
doc.Pages[0].AddText('Hello', 72, 720, { fontSize: 14 });
doc.AddPage(PageFormat.A4.landscape()); // append more as you go
doc.WriteTo('scratch.pdf');Водяні знаки та номери сторінок
Page.AddText() також підтримує обертання, колір і непрозорість, чого достатньо для відображення номера сторінки та діагонального водяного знака без додаткових класів.
const doc = Document.OpenFile('in.pdf');
const page = doc.Pages[0];
// Page number, right-aligned near the bottom-right corner.
const w = page.Rect[2] - page.Rect[0];
page.AddText(`Page ${page.Number}`, w - 40, 20, { fontSize: 10, align: 'right' });
// Semi-transparent diagonal watermark, centered on the page.
page.AddText('DRAFT', page.Rect[2] / 2, page.Rect[3] / 2, {
font: 'Times-Bold', fontSize: 64, color: [0.7, 0.7, 0.7], opacity: 0.4, rotate: 45, align: 'center',
});
doc.WriteTo('out.pdf');Інспекція потоку вмісту
parseContentStream() декодує необроблений /Contents потік сторінки у список пар оператор/операнд, а serializeContentStream() перетворює відредагований список операторів назад у байти.
import { parseContentStream, serializeContentStream } from '@asposefoss/pdf';
const ops = parseContentStream(doc.Pages[0].Contents);
// ops: { operator: string, operands: PdfObject[], inlineImage?: {...} }[]
for (const op of ops) {
if (op.operator === 'Tj') console.log('text op:', op.operands);
}
const bytes = serializeContentStream(ops); // round-trips operators + operands
Багатостовпчиковий потік тексту
Page.AddTextBlock() розпреділяє довгий рядок тексту по прямокутній області та повертає будь-який текст, який не вмістився, його можна передати у другий виклик, щоб продовжити потік в інший стовпець.
const rest = page.AddTextBlock(longText, [72, 600, 200, 150], {
font: 'Times-Roman', fontSize: 11, align: 'justify', valign: 'top', leading: 14,
});
if (rest) page.AddTextBlock(rest, [300, 600, 200, 150]); // continue into a 2nd column
Поради та найкращі практики
- Використовуйте
Document.OpenFile()для шляхів до файлів іDocument.Open()для данихUint8Arrayу пам’яті. - Номери сторінок, що передаються у методи, такі як
RemovePage()іExtractPages(), нумеруються з1, тоді якdoc.Pages— це масив, нумерація в якому починається з0. - Передайте
{ compressed: true }уDocument.WriteTo(), щоб увімкнути стискання xref-stream та object-stream при виводі. Document.ExtractPages()приймає повторювані номери сторінок, тому одна й та сама вихідна сторінка може з’явитися в результаті кілька разів.- Прочитайте
page.Rect, щоб обчислювати позиції відносно фактичної ширини та висоти сторінки, а не задавати координати жорстко.
Типові проблеми
| Проблема | Причина | Виправлення |
|---|---|---|
Document.Open() / OpenFile() викидає InvalidPasswordError | PDF захищено паролем, і пароль (або неправильний) не був вказаний | Передайте { password: '...' } до Document.OpenFile() / Document.Open() |
RemovePage() видаляє неправильну сторінку | Номери сторінок, передані до RemovePage(), нумеруються з 1, а не з 0 | Передайте номер сторінки, який починається з 1, відмінний від індексування масиву doc.Pages |
Вихід WriteTo() більший, ніж очікувалося | За замовчуванням збереження не використовує стиснення xref/object-stream | Передайте { compressed: true } у Document.WriteTo() |
FAQ
Чи приймає Document.Open() і шляхи до файлів, і дані в пам’яті?
Document.OpenFile() відкриває з файлового шляху; Document.Open() приймає Uint8Array байтів у пам’яті.
Чи нумерація сторінок починається з 0 чи з 1?
Обидва варіанти, залежно від API: doc.Pages — це простий 0-базовий масив, але методи, такі як RemovePage() і ExtractPages(), використовують 1-базову нумерацію сторінок.
Чи можу я зашифрувати документ під час його збереження?
Так — передайте параметр encrypt у WriteTo() / Save() разом із algorithm: 'aes256' | 'aes128' | 'rc4' та додатковими паролями користувача/власника.
Як зменшити розмір вихідного файлу?
Передайте { compressed: true } у Document.WriteTo(), щоб увімкнути стискання xref-stream та object-stream.
Чи можу я переглянути необроблені оператори потоку вмісту сторінки?
Так — parseContentStream(doc.Pages[0].Contents) повертає список операторів, а serializeContentStream() перетворює відредагований список назад у байти.
API Reference Огляд
| Клас / Метод | Опис |
|---|---|
Document | Центральна точка входу для створення, завантаження та збереження PDF-документів |
Document.OpenFile() / Document.Open() | Завантажити PDF з шляху до файлу або з байтів у пам’яті |
Document.New() | Створити порожній документ з заданим PageFormat |
Document.WriteTo() / Document.Save() | Записати документ у шлях до файлу або повернути байти |
Document.Split() / Document.Merge() / Document.ExtractPages() | Розділяти, об’єднувати та витягувати сторінки між документами |
Document.Append() / Document.InsertPage() | Скопіюйте сторінки з одного документа в інший |
Page | Одна сторінка PDF; надає методи тексту, зображення, анотації та content-stream |
Page.AddText() / Page.AddTextBlock() | Додати позиціонований або потіковий текст на сторінку |
parseContentStream() / serializeContentStream() | Розпарсити та повторно серіалізувати необроблені оператори content-stream сторінки |