PDFium Component Docs

Konwersja kolorów całego dokumentu PDF

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

Example

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);

Public declarations

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;