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