ConvertPdfDocumentColours odczytuje aktywną rewizję PDF, konwertuje oryginalne operandy komponentów i próbki obrazów przez IPdfColourTransform oraz dopisuje spójną rewizję do osobnego strumienia wyjściowego
Obsługuje operatory wypełnień i konturów tekstu i wektorów w przestrzeniach DeviceGray, DeviceRGB, DeviceCMYK i ICCBased, dziedziczone zasoby stron, nazwane aliasy domyślnych przestrzeni kolorów, zagnieżdżone Form XObject oraz surowe lub filtrowane ogólnie obrazy o 8-bitowych lub 16-bitowych komponentach
Tablice zawartości współdzielą jeden parser operandów i stos stanu graficznego z odstępem między strumieniami; q/Q, domyślne przestrzenie kolorów i liczby komponentów pozostają związane ze swoimi pierwotnymi przestrzeniami źródłowymi przez całą konwersję
Operandy CMYK pochodzą z zawartości PDF i strumieni obrazów, nigdy z renderowanych getterów RGB; dla nieopisanych źródeł DeviceCMYK podaj DeviceCMYKProfile
Źródłowe profile ICCBased są rozwiązywane w ich pierwotnym zakresie zasobów; obsługiwany jest tylko brakujący lub domyślny /Range [0 1 ...], a tablice /Decode obrazów są stosowane przed konwersją i usuwane z przekonwertowanego obrazu
Obrazy zachowują big-endian kolejność PDF dla próbek 16-bitowych; dokładna geometria bajtów i rozszerzenie docelowe są sprawdzane przed alokacją próbek i żadne bajty stride ani dopełnienia nie są wymyślane
PreserveAllSpotColours domyślnie ma wartość true; w przeciwnym razie wypełnij PreservedSpotColours zdekodowanymi nazwami barwników PDF, a przestrzeń Separation lub DeviceN jest zachowywana tylko wtedy, gdy wybrano wszystkie wymienione barwniki
Zachowane operatory spot, funkcje tint i zasoby pozostają nienaruszone; niewybrane kolory spot wymagają dedykowanego backendu konwersji i są raportowane jako nieobsługiwane
Maski szablonowe obrazów i referencjonowane dane masek pozostają nienaruszone; maski color-key, maski jawne i komponenty matte miękkich masek wymagają osobnych polityk
Granice nieobsługiwane to m.in. obrazy DCT/JPX bez dekodera oryginalnych komponentów, obrazy 1/2/4-bitowe i ich dopełnienie wierszy, niedomyślne zakresy ICC, przestrzenie Indexed/Cal/Lab/Pattern, obrazy inline, funkcje shading, programy glifów Type3, kolory w słownikach adnotacji, instrukcje domyślnego wyglądu formularzy, kolorowa zawartość XFA, grupy przezroczystości, nienormalne tryby mieszania, overprint, funkcje transferu grafiki i intenty renderowania
Formularze z własnymi zasobami muszą ustanowić swoją przestrzeń kolorów przed nagimi operandami sc/scn; współdzielone formularze lub obrazy, których dziedziczony kontekst źródłowy się różni, są raportowane jako nieobsługiwane, a buforowane niepowodzenia propagują się do każdego wywołującego zakresu
FailOnUnsupported domyślnie ma wartość true i zachowuje dokument docelowy przy niepowodzeniu; ustawienie false pozwala na niezależne obsługiwane aktualizacje, ustawia Complete na false i nigdy nie zapisuje nowego OutputIntent dla konwersji częściowej
Wynik częściowy może zachować istniejący OutputIntent ze swojego źródła; OutputIntentWritten raportuje konkretnie, czy ta operacja zainstalowała nową deklarację celu
Pełny wynik osadza podany docelowy profil ICC i zapisuje OutputIntent z żądanym identyfikatorem; nie certyfikuje to PDF/X, PDF/A ani innego poziomu zgodności
Źródło i cel muszą być różnymi strumieniami; pozycja źródła jest przywracana, niepowodzenia przygotowania pozostawiają cel bez zmian, a anulowanie zachowuje EPdfOperationCancelled
Publikacja przygotowanego wyniku podmienia cel przez jego API strumienia; wyjątek przy obcinaniu lub zapisie celu może zostawić częściowe wyjście, więc wywołujący potrzebujący atomowej publikacji pliku powinni zapisywać do pliku tymczasowego i zmienić jego nazwę po sukcesie
Szyfrowanie i istniejące podpisy wymagają osobno przygotowanego nieszyfrowanego, niepodpisanego źródła; przyrostowa konwersja kolorów nie zachowuje ważności podpisów
Domyślne limity to 64 MiB na zdekodowany strumień zawartości/obrazu, 512 MiB buforowania wyjścia, 10,000 raportów problemów i głębokość 64, ponadto obowiązują budżety czytnika aktywnych obiektów
Budżet wyjścia konserwatywnie obejmuje bajty źródła, buforowane obiekty zastępcze i zarezerwowany narzut xref/trailer przed akumulacją każdej aktualizacji; pełna długość traileru jest wliczana przed serializacją, a ograniczony strumień wyjściowy odrzuca zapisy ponad limit przed powiększeniem swojego rozmiaru logicznego
To ogranicza logiczne buforowanie wyjścia, a nie całą pamięć procesu ani zaokrąglenia pojemności alokatora; finalny rozmiar zserializowany jest sprawdzany ponownie przed publikacją
Rzeczywista konwersja obrazów RGB, CMYK i ICCBased, konwersja tekstu/wektorów, zagnieżdżone formularze, zachowanie Separation i DeviceN, OutputIntent, skompresowane strumienie obiektów oraz zapis/ponowne otwarcie/renderowanie PDF są weryfikowane z Delphi i FPC na Win32 i Win64
ProviderOptions := TPdfLittleCmsOptions.Default; Provider := CreatePdfLittleCmsColourTransform(LibraryPath, ProviderOptions); Options := TPdfDocumentColourOptions.Default; Options.DeviceCMYKProfile := SourceCmykProfile; TargetProfile := CreatePdfLittleCmsGrayProfile(LibraryPath); if not ConvertPdfDocumentColours(Source, Destination, pcsDeviceGray, TargetProfile, Provider, Options, Report, CancellationToken) then raise Exception.Create(Report.ErrorText);
type
TPdfSpotColourNames = array of AnsiString;
TPdfDocumentColourOptions = record
ReadOptions: TPdfActiveObjectReadOptions;
MaxDecodedStreamBytes: Integer;
MaxOutputBytes: Int64;
MaxIssues: Integer;
MaxDepth: Integer;
FailOnUnsupported: Boolean;
PreserveAllSpotColours: Boolean;
PreservedSpotColours: TPdfSpotColourNames;
DeviceGrayProfile, DeviceRGBProfile, DeviceCMYKProfile: TBytes;
OutputIntentIdentifier: string;
class function Default: TPdfDocumentColourOptions; static;
end;
TPdfDocumentColourIssue = record
ObjectNumber: Integer;
Reason: string;
end;
TPdfDocumentColourIssues = array of TPdfDocumentColourIssue;
TPdfDocumentColourReport = record
Succeeded: Boolean;
Complete: Boolean;
ContentStreamsConverted, FormsConverted, ImagesConverted: Integer;
ColourOperatorsConverted, PreservedSpotSelections, PreservedMasks: Integer;
UnsupportedCount: Integer;
OutputIntentWritten: Boolean;
Issues: TPdfDocumentColourIssues;
ErrorText: string;
end;
function ConvertPdfDocumentColours(Source, Destination: TStream;
TargetSpace: TPdfColourSpace; const TargetProfile: TBytes;
Transform: IPdfColourTransform; const Options: TPdfDocumentColourOptions;
out Report: TPdfDocumentColourReport;
CancellationToken: IPdfCancellationToken = nil): Boolean;