Ograniczona edycja akapitów

HPDFParagraphReflow wybiera środki glifów wczytanych dokumentów wewnątrz jawnego prostokąta źródła i zapisuje nowo wymierzony akapit wewnątrz jawnego prostokąta celu na tej samej stronie

Profil przyjęcia obejmuje Delphi Win32/Win64 i Windows FPC/Lazarus; mierzone generowanie fontów używa istniejącego budowniczego wyglądów dokumentu i jego wsparcia zainstalowanych fontów

Wybór, layout i zachowanie

Współrzędne to punkty przestrzeni użytkownika nieobróconej strony PDF, z osią y skierowaną w górę; oba prostokąty muszą być skończone, mieć dodatnie wymiary nie większe niż 14400 punktów i mieścić się w MediaBox strony

Wybór może obejmować wiele oryginalnych linii bazowych i wiele strumieni zawartości strony; literałowe, szesnastkowe, TJ, pojedynczo i podwójnie cytowane operandy tekstu są przepisywane na wybranych granicach kodów znaków

Zachowane prefiksy, sufiksy, posunięcia tekstu i oryginalne numeryczne korekty kerningu pozostają na miejscu; tekst źródła jest usuwany z rzeczywistych operandów, a nie ukrywany prostokątem tła

Zagnieżdżone Form XObjects używają swoich Matrix i BBox; każde wybrane wywołanie i jego zasoby przodków są kopiowane prywatnie, zachowując inne wywołania i inne strony współdzielące oryginalne Forms

Środki glifów poza BBox formularza są wykluczane; częściowe granice glifów źródła domyślnie odrzucają, a RejectPartialSourceGlyphs = False jawnie pozwala usunąć cały kod znaku, gdy jego środek jest wybrany

Appearance wybiera zainstalowany font, styl, rozmiar, kolor, padding, wyrównanie i politykę przepełnienia; szerokość celu steruje zawijaniem, a shrink-to-fit raportuje rzeczywisty EffectiveFontSize

Wygenerowana geometria glifów jest niezależnie interpretowana i sprawdzana względem prostokąta celu; rotacja jest ustalona na zero, a krycie na jeden dla tego ograniczonego helpera

Pusta podmiana usuwa wybrany tekst źródła; ustaw RequireSourceText = False, by wstawić akapit do pustego regionu źródła

Dowody kolizji

Nie Wybrany tekst niebędący białymi znakami, obrazy XObject i inline, malowane granice ścieżek i prostokąty adnotacji są porównywane z wygenerowanymi granicami glifów podmiany

Każda kolizja identyfikuje swój rodzaj, granice w przestrzeni strony, opcjonalny sąsiadujący tekst i indeks glifu podmiany; łączna liczba jest zachowywana nawet, gdy zwrócona lista kolizji osiągnie swój limit

Punkty kontrolne ścieżek, transformowane granice clipu Form, szerokość obrysu i limity miter dają konserwatywne ramki; cieniowanie o nieznanym zasięgu malowania konserwatywnie zajmuje cały prostokąt celu

Ten test geometrii może nadraportować przezroczyste obrazy, niemalowane obszary adnotacji, krzywe, przycięte ścieżki i obrócone koperty Form; nie dowodzi separacji tuszu idealnej piksel w piksel ani nie sprawdza dowolnych ścieżek clipu, kompozycji blendowania ani konturów fontów

RejectCollisions = True odrzuca nakładające się podmiany bez mutacji; ustawienie false zachowuje raport, pozwalając na przemyślaną politykę nakładania wywołującego

Podgląd, commit i rollback

HPDFPreviewParagraphReflow zwraca należący do wywołującego zaplombowany plan, semantyczny layout podmiany, odciski palców i dowody kolizji, po czym wycofuje wygenerowane obiekty dokumentu

HPDFCommitParagraphReflow powtarza ograniczoną analizę i atomowo stosuje plan tylko wtedy, gdy zawartość źródła, granice Form, geometria adnotacji i geometria fontu podmiany nadal pasują do podglądu

Plan należy do tej samej żywej instancji dokumentu; zwolnij go po skończeniu, utrzymuj dokument żywym przez cały czas i regeneruj podgląd po wczytaniu innego dokumentu albo zmianie wybranej zawartości

THPDFParagraphReflowSession dodaje zastosowany stan przeglądu: Apply wystawia edytowany dokument do ekstrakcji albo renderowania, Commit go publikuje, a Rollback albo zniszczenie przywraca oryginalny graf

Używaj sesji szeregowo; dokument musi przeżyć sesję, a innych transakcji grafu albo wywołań edycji nie wolno przeplatać, gdy Pending jest true

Rollback przywraca stan dokumentu w pamięci; już zapisane pliki zewnętrzne pozostają odpowiedzialnością wywołującego

Skończona praca i zachowanie przy błędach

Domyślne limity to 64 MiB zdekodowanej zawartości, 64 MiB wygenerowanych strumieni, 100000000 jednostek pracy, 100000 glifów, 250000 tokenów, 12 poziomów Form, 256 wywołań Form, 256 zwracanych kolizji i 100000 sklonowanych węzłów zasobów

Zakodowane bajty łańcuchów są sprawdzane przed interpretacją glifów względem pozostałego limitu glifów, więc wielobajtowe kodowania znaków mogą konserwatywnie konsumować więcej budżetu niż ich widoczna liczba glifów

Limity zdekodowane i wygenerowane obejmują zawartość obsługiwaną przez helper; rozmiar wygenerowanego strumienia jest sprawdzany przed publikacją i nie reprezentuje limitu pamięci szczytowej procesu ani nie ogranicza wszystkich alokacji budowniczego zainstalowanych fontów

Anulowanie jest kooperatywne przez tokenizację zawartości i pętle helpera, z kontrolami wokół istniejących wywołań generowania fontów; utrzymuj token żywy do zakończenia wywołania

Brakujące źródło, niepoprawne wejście, kolizje, nieaktualne plany, nieobsługiwana zawartość, wyczerpane budżety, anulowanie i zwykłe niepowodzenia zwracają false z jawnym statusem i zachowują oryginalny graf obiektów

Wybrany tekst pionowy albo pojedynczy, cykliczne albo nierozwiązane Forms, nieobsługiwane malowane typy XObject i dokumenty z polami podpisów są odrzucane; edycja przyrostowa zachowująca podpisy wymaga osobnego workflow

Przykład

Options := HPDFDefaultParagraphReflowOptions;
Options.Appearance.FontName := 'Arial';
Options.Appearance.FontSize := 11;
Source.Left := 55; Source.Bottom := 659;
Source.Right := 350; Source.Top := 714;
Target := Source;
Plan := nil;
try
  if HPDFPreviewParagraphReflow(Document, 0, Source, Target,
    'The Supplier must deliver signed monthly reports.', Options,
    Plan, Report, CancellationToken) then
    if HPDFCommitParagraphReflow(Document, Plan, Report, CancellationToken) then
      Document.SaveLoadedDocument('reviewed-contract.pdf');
finally
  Plan.Free;
end;

Akceptacja i zapisane wyjście

Dedykowane runner Delphi i FPC używa rzeczywistych fiksatur wczytanych PDF dla akapitów wielobazowych, częściowych operandów, zagnieżdżonych współdzielonych Forms, przyciętego tekstu Form, zmian szerokości i fontu, rodzajów kolizji, anulowania i rollbacku grafu

Powtórzone zapisy plik/plik i strumień/plik zachowują edytowany graf; świeże niezmienione wczytane dokumenty zachowują dokładne bajty źródła, a wstrzyknięte niepowodzenie zapisu wyjścia może być nastąpione udanym ponowieniem

Tests/Fixtures/ParagraphReflow/loaded-repeat-save.pdf izoluje regresję zapisu bez użycia helpera akapitów: wczytaj, wstaw marker, zapisz dwa razy i niezależnie odczytaj drugi plik

Uruchom Tests/Delphi/Run-ParagraphReflowTests.ps1 -Platform Win64 albo Tests/FPC/Run-ParagraphReflowTests.ps1 -Platform Win64 i wybierz Win32 dla drugiej architektury

Opcjonalny weryfikator Python Tests/Fixtures/ParagraphReflow/verify_output.py używa PyMuPDF, by wyodrębnić rzeczywisty zapisany tekst Unicode i renderować edytowane strony; każdy runner tłumi automatyczne uruchamianie przeglądarki

Powiązane tematy

Ograniczona edycja akapitów · Opcje · Raport