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 i Document.Open() do danych Uint8Array w pamięci.
  • Numery stron przekazywane do metod takich jak RemovePage() i ExtractPages() są numerowane od 1, podczas gdy doc.Pages jest tablicą indeksowaną od 0.
  • Przekaż { compressed: true } do Document.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

ProblemPrzyczynaPoprawka
Document.Open() / OpenFile() wyrzuca InvalidPasswordErrorPlik 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 0Przekaż numer strony numerowany od 1, odmienny od indeksowania tablicy doc.Pages
Wyjście WriteTo() jest większe niż oczekiwanoDomyślne zapisywanie nie używa kompresji xref/object-streamPrzekaż { 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 / MetodaOpis
DocumentCentralny 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
PageJedna 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

Zobacz także

 Polski