PDFium Delphi Component Docs

文書の ICC 色変換

ConvertPdfDocumentColours は現在有効な PDF リビジョンを読み、元の成分オペランドと画像サンプルを IPdfColourTransform で変換して、整合したリビジョンを別の出力ストリームに追加します

DeviceGray、DeviceRGB、DeviceCMYK、ICCBased のテキストとベクトルの塗り/線オペレーター、継承したページリソース、名前付きの既定色空間エイリアス、入れ子の Form XObject、8 ビットまたは 16 ビット成分の raw/一般フィルター画像に対応します

内容配列では、ストリーム間に空白を入れてオペランドパーサーとグラフィックス状態スタックを共有します。変換中も q/Q、既定色空間、成分数は元のソース色空間に基づきます

CMYK オペランドは PDF の内容と画像ストリームから取得し、描画後の RGB getter は使いません。プロファイルのない DeviceCMYK には DeviceCMYKProfile を指定してください

ソースの ICCBased プロファイルは元のリソーススコープから解決します。/Range [0 1 ...] は省略または既定値だけに対応します。画像の /Decode 配列は変換前に適用し、変換後の画像から削除します

画像の 16 ビットサンプルは PDF のビッグエンディアン順を維持します。サンプル確保前に正確なバイト数と出力側の拡張量を検査し、stride や padding のバイトを追加することはありません

PreserveAllSpotColours は既定で true です。false の場合はデコード済みの PDF 色材名を PreservedSpotColours に指定します。Separation または DeviceN は、列挙されるすべての色材を選択した場合だけ保持します

保持する特色のオペレーター、濃度関数、リソースは変更しません。選ばれていない特色には専用の変換バックエンドが必要で、未対応として報告します

画像の stencil mask と参照された mask データは保持します。color-key mask、明示的 mask、soft mask の matte 成分には別のポリシーが必要です

元の成分を取り出すデコーダーのない DCT/JPX 画像、1/2/4 ビット画像と行 padding、既定以外の ICC 範囲、Indexed/Cal/Lab/Pattern 色空間、inline image、shading 関数、Type3 glyph program、注釈辞書の色、フォームの既定外観命令、XFA の色内容、透明グループ、通常以外の blend、overprint、グラフィックスの transfer 関数や rendering intent は未対応です

独自のリソースを持つ Form は、成分だけの sc/scn を使う前に色空間を設定する必要があります。継承元のソースコンテキストが異なる共有 Form や画像は未対応とし、キャッシュした失敗は呼び出したすべてのスコープに伝播します

FailOnUnsupported は既定で true で、失敗時に出力先を保持します。false にすると対応可能な独立した更新を許可し、Complete を false にします。部分変換では新しい OutputIntent を書きません

部分的な結果にはソースにあった OutputIntent が残る場合があります。OutputIntentWritten は、この処理が新しい出力先の宣言を追加したかどうかを示します

完全な結果には指定した出力 ICC プロファイルを埋め込み、要求された識別子で OutputIntent を書きます。PDF/X、PDF/A などの適合性を認証するものではありません

ソースと出力先は別のストリームである必要があります。ソース位置は復元し、準備段階の失敗では出力先を変更せず、キャンセルは EPdfOperationCancelled を維持します

準備した結果の公開は、出力先のストリーム API で内容を置き換えます。切り詰めや書き込み中の例外では部分出力が残り得るため、ファイルをアトミックに公開する必要がある場合は一時ファイルに書き、成功後に rename してください

暗号化や既存の署名がある場合は、別途暗号化も署名もないソースを準備してください。増分の色変換では署名の有効性を保持できません

既定の上限はデコードした内容/画像ストリームごとに 64 MiB、出力の準備に 512 MiB、問題報告 10,000 件、深さ 64 で、さらに有効オブジェクトリーダーの上限が適用されます

出力上限は更新を蓄積する前に、ソースのバイト数、置換オブジェクト、xref/trailer 用の余裕を保守的に含めます。シリアライズ前には trailer 全体の長さも含め、制限付き出力ストリームは論理サイズを増やす前に上限超過の書き込みを拒否します

制限するのは出力準備の論理サイズであり、プロセスメモリ全体やアロケーターによる容量の切り上げではありません。公開前に最終シリアライズサイズをもう一度検査します

実際の RGB、CMYK、ICCBased 画像変換、テキスト/ベクトル変換、入れ子の Form、Separation と DeviceN の保持、OutputIntent、圧縮オブジェクトストリーム、PDF の保存/再読み込み/描画を、Delphi と FPC の Win32/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;