Skip to content

feat: allow functions in replaceImage for programmatic image conversion#766

Draft
u1f992 wants to merge 19 commits into
mainfrom
feat/replace-image-function
Draft

feat: allow functions in replaceImage for programmatic image conversion#766
u1f992 wants to merge 19 commits into
mainfrom
feat/replace-image-function

Conversation

@u1f992
Copy link
Copy Markdown
Member

@u1f992 u1f992 commented Mar 25, 2026

CMYKへ機能を追加するPRです。ラスター画像をJavaScript側で変換する方法を提供します。またこれに合わせて、CMYK有効時にRGB画像が置換されずに残ったら警告が出るようにしました(色置換と同じ理屈)。サンプルに使用例を追加しているのでご確認ください。

カラーマネージメントの専門的なライブラリはJavaScriptにはほとんどないので、MuPDFを使って簡易的に自動変換するbuiltinGrayReplacement() builtinCmykReplacement()もexportしています。ICCプロファイルを渡すこともでき、その場合はグローバルなICC状態の汚染を防ぐため別のmupdf WASMインスタンスで変換を行う必要があります。このためにnode_modulesの中を見に行くようになっておりここは特殊です。

現在のところPNGを書き出してどうにかしてもらうことしか想定していませんが、将来の拡張のためにasPNG()を経由して画像を得るようにしています。PDFの情報などを渡せるのではないかと考えていますが、有用な使いみちは思いついていないので現時点ではasPNGだけです。

import { builtinGrayReplacement, defineConfig } from '@vivliostyle/cli';

export default defineConfig({
    replaceImage: [
      { source: /^(.*)_rgb\.png$/, replacement: (img) => { /* ファイルとの照合でも使える */ } },

      // 関数はsource:*相当(前から順に一致するか確認するのは以前からの挙動と一貫性あり)
      (img) => {
        const png = img.asPNG();
        // なんらかの方法でCMYK画像に変換する
        const anyCMYKImageThatCanBeLoadedByMuPDF = new Uint8Array();
        return anyCMYKImageThatCanBeLoadedByMuPDF;
      },

      // 自動変換(この例ではすべて上の関数で処理されてしまうので意味なし)
      builtinGrayReplacement()
    ],
  },
});

@u1f992 u1f992 marked this pull request as ready for review March 25, 2026 07:27
@u1f992 u1f992 requested a review from spring-raining as a code owner March 25, 2026 07:27
Comment thread src/config/schema.ts
Comment on lines +294 to +299
warnUnreplacedImages: v.pipe(
v.boolean(),
v.description($`
Warn when non-CMYK-compatible images remain in the PDF after image replacement. (default: true)
`),
),
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warningとして表示させるだけでなく、エラーとして動作を失敗させるようにして欲しいという要件もあるかもしれません。ifUnreplacedImagesFound: 'warn' | 'error' | 'ignore' などのように、画像がreplaceされなかった時の動作を指定するような設計を検討できますか?

@u1f992
Copy link
Copy Markdown
Member Author

u1f992 commented Apr 6, 2026

開発者会議での報告の通り、カラースペースサポートを入れた後で同様の機能を再検討します。

@u1f992 u1f992 marked this pull request as draft April 6, 2026 00:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants