Rdzeń API
Podstawowe API
Ten przewodnik pokazuje, jak otwierać, edytować, scalać i zapisywać dokumenty PDF przy użyciu klas Document i Page — punktów wejścia dla każdej operacji w Aspose.PDF FOSS dla TypeScript. Document ładuje, tworzy, scala i zapisuje całe pliki PDF; Page, dostępny przez doc.Pages, udostępnia operacje na tekście, obrazie, adnotacjach i strumieniach zawartości na poziomie stron.
Cykl życia dokumentu
Document.OpenFile() otwiera PDF z ścieżki pliku; Document.Open() przyjmuje Uint8Array w pamięci. Strony można przeglądać i edytować w miejscu, a Document.WriteTo() zapisuje wynik — opcjonalnie z kompresją xref-stream i 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
Dzielenie, łączenie i wyodrębnianie stron
Document.Split() zwraca jeden Document na stronę. Document.ExtractPages() przyjmuje listę stron numerowanych od 1, z dopuszczonymi powtórzeniami i zwraca nowy Document zawierający tylko te strony. Document.Append() i Document.InsertPage() kopiują strony pomiędzy dokumentami, a Document.Merge() łączy kilka dokumentów w jeden.
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
Tworzenie nowego dokumentu
Document.New() rozpoczyna pusty dokument w określonym PageFormat. Page.AddText() umieszcza tekst w określonych pozycjach, a Document.AddPage() dodaje kolejne strony, w tym obrócony format, taki jak 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');Znaki wodne i numery stron
Page.AddText() obsługuje także obrót, kolor i przezroczystość, co wystarczy, aby wygenerować numer strony i ukośny znak wodny bez dodatkowych klas.
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');Introspekcja strumienia zawartości
parseContentStream() dekoduje surowy strumień /Contents strony do listy par operator/operand, a serializeContentStream() konwertuje edytowaną listę operatorów z powrotem na bajty.
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
Przepływ tekstu w wielu kolumnach
Page.AddTextBlock() przepuszcza długi ciąg tekstu do prostokątnego obszaru i zwraca tekst, który nie zmieścił się, co można podać do drugiego wywołania, aby kontynuować przepływ w kolejnej kolumnie.
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
Wskazówki i najlepsze praktyki
- Używaj
Document.OpenFile()do ścieżek plików iDocument.Open()do danychUint8Arrayw pamięci. - Numery stron przekazywane do metod takich jak
RemovePage()iExtractPages()są numerowane od 1, podczas gdydoc.Pagesjest tablicą indeksowaną od 0. - Przekaż
{ compressed: true }doDocument.WriteTo(), aby włączyć kompresję xref-stream i object-stream w wyjściu. Document.ExtractPages()akceptuje powtarzające się numery stron, więc ta sama strona źródłowa może pojawić się więcej niż raz w wyniku.- Odczytaj
page.Rect, aby obliczyć pozycje względem rzeczywistej szerokości i wysokości strony, zamiast na stałe kodować współrzędne.
Typowe problemy
| Problem | Przyczyna | Poprawka |
|---|---|---|
Document.Open() / OpenFile() wyrzuca InvalidPasswordError | Plik PDF jest zabezpieczony hasłem i nie podano hasła (lub podano niewłaściwe) | Przekaż { password: '...' } do Document.OpenFile() / Document.Open() |
RemovePage() usuwa niewłaściwą stronę | Numery stron przekazywane do RemovePage() są numerowane od 1, a nie od 0 | Przekaż numer strony numerowany od 1, odmienny od indeksowania tablicy doc.Pages |
Wyjście WriteTo() jest większe niż oczekiwano | Domyślne zapisywanie nie używa kompresji xref/object-stream | Przekaż { compressed: true } do Document.WriteTo() |
FAQ
Czy Document.Open() akceptuje zarówno ścieżki do plików, jak i dane w pamięci?
Document.OpenFile() otwiera z ścieżki pliku; Document.Open() akceptuje Uint8Array bajtów w pamięci.
Czy numeracja stron zaczyna się od 0 czy od 1?
Oba, w zależności od API: doc.Pages jest zwykłą tablicą zerowo-indeksowaną, ale metody takie jak RemovePage() i ExtractPages() przyjmują numerację stron zaczynającą się od 1.
Czy mogę zaszyfrować dokument podczas zapisywania?
Tak — przekaż opcję encrypt do WriteTo() / Save() wraz z algorithm: 'aes256' | 'aes128' | 'rc4' oraz opcjonalnymi hasłami użytkownika/właściciela.
Jak mogę zmniejszyć rozmiar pliku wyjściowego?
Przekaż { compressed: true } do Document.WriteTo(), aby włączyć kompresję xref-stream i object-stream.
Czy mogę przejrzeć surowe operatory strumienia zawartości strony?
Tak — parseContentStream(doc.Pages[0].Contents) zwraca listę operatorów, a serializeContentStream() konwertuje edytowaną listę z powrotem na bajty.
API Reference Podsumowanie
| Klasa / Metoda | Opis |
|---|---|
Document | Centralny punkt wejścia do tworzenia, ładowania i zapisywania dokumentów PDF |
Document.OpenFile() / Document.Open() | Załaduj PDF ze ścieżki pliku lub z bajtów w pamięci |
Document.New() | Rozpocznij pusty dokument z podanym PageFormat |
Document.WriteTo() / Document.Save() | Zapisz dokument do ścieżki pliku lub zwróć bajty |
Document.Split() / Document.Merge() / Document.ExtractPages() | Podziel, scal i wyodrębnij strony pomiędzy dokumentami |
Document.Append() / Document.InsertPage() | Skopiuj strony z jednego dokumentu do drugiego |
Page | Jedna strona PDF; udostępnia metody tekstu, obrazu, adnotacji i content-stream |
Page.AddText() / Page.AddTextBlock() | Dodaj pozycjonowany lub przepływający tekst do strony |
parseContentStream() / serializeContentStream() | Parsuj i ponownie serializuj surowe operatory content-stream strony |