最近の更新: CHANGELOG_ja.md
PSD のテキストレイヤを一覧して書き換えるローカルツール。 Photoshop を開かずに、翻訳・校正・表記ゆれ修正といったテキストの再編集を行う。
- レイヤツリーとテキスト一覧を並べて表示し、その場で本文を編集
- CSV 書き出し / 読み込みで一括置換 (翻訳やレビューの外注に使える)
- 編集していないレイヤはバイト単位でそのまま保存される
- ブラウザが UI。exe 1 つで動き、閉じれば自動で終了する
psdtext ファイル選択から始める
psdtext foo.psd 起動と同時に開く
psdtext foo.psd --repl REPL つき (エージェント / 自動テスト用)
構成:
| UI / フレームワーク | wamsoft/appserve — ローカル HTTP サーバ + ブラウザ UI |
| PSD 読み書き | wamsoft/psdparse — pure C++17 PSD reader/writer |
| ペイン | 役割 |
|---|---|
| 左 | レイヤツリー。階層の折り畳みと、フォルダ / 個別レイヤの表示 ON/OFF |
| 中央 | 表示 ON/OFF を反映した合成プレビュー |
| 右 | 選択したテキストレイヤの編集 (書式マーク・本文・位置) |
表示 ON/OFF はプレビュー専用で PSD には保存されない。「元に戻す」で PSD が 持っている表示状態へ戻る。
合成はブラウザの canvas 上で行うので、ON/OFF の切り替えはサーバ往復なしで 即座に反映される。ブレンドモードと不透明度、クリッピングレイヤに対応している (グループのブレンド・調整レイヤ・レイヤ効果は未対応)。最終確認は Photoshop で 行う前提の作業用プレビューという位置づけで、その旨と、開いている PSD で 実際に影響が出ている箇所は画面下に常時表示される。
UI は英語と日本語に対応している。既定はブラウザの言語で、ツールバーから切り替え られる。
使い方は本体内に組み込んである (? ボタン / F1)。
ズームの 100% は実ドット等倍 (画像 1px = 画面 1 デバイス px)。システムの 表示スケールが 200% でも倍サイズにならないよう逆補正している。
PSD に入っているテキストの描画済み画像は Photoshop でしか作れないので、 編集したテキストレイヤは canvas に描き直して重ねる(「テキスト仮描画」で切替)。 組版 (字詰め / 禁則 / 縦書き / 変形) までは再現しないので、内容と位置の確認用。 フォントもこの PC に入っているものしか使えない (無い場合は編集欄に注記が出る)。
保存した PSD を Photoshop で開くと、テキストの中身は編集後になっているが、 画面に出る絵は編集前のままになる。Photoshop はファイルを開いただけでは テキストを描き直さないため。
同梱の tools/update-text-layers.jsx を「ファイル > スクリプト > 参照...」から
実行すると、Photoshop 自身が全テキストレイヤを描き直す。組版も書式も行揃えも
そのまま正しく出るので、あとは上書き保存すればよい。テキストツールでレイヤを
一度触っても同じことが起きる。
psdtextを起動するとブラウザ (Edge / Chrome のアプリモード) が開く- 「開く…」で PSD を選ぶ。psdtext.exe やそのショートカットへ PSD をドロップ しても開ける。ダイアログは前回開いたフォルダから始まる
- 左のツリーからテキストレイヤを選び、右のペインで編集
- 反映 (Ctrl+Enter) で文書に取り込み、保存 (Ctrl+S) でファイルへ書き出す
Ctrl+Shift+Enter で反映してそのまま次のテキストレイヤへ移る (本文は全選択 された状態になるので、続けて打ち替えられる)。Alt+↑/↓ で前後のテキスト レイヤへ。左ペインの「一覧」でテキスト / 未保存 / 表示中に絞り込める。
書式は書式マークで編集する。編集欄にタグは出てこない代わりに、書式の
変わり目に ◆ の札が入っている。編集の対象はカーソルが属しているマークで、
本文のどこかにカーソルを置けば、そこに効いているマークがパネルに出る。
手前にマークが無ければ「基準」= レイヤ全体の初期書式で、そこを変えると
書式指定の無いところがまとめて変わる (ふだんはこれだけで済む)。
札はクリックで選べて、Backspace で 1 文字のように消せる。本文を範囲選択
すればその範囲だけに書式を付けられる。書式の変更はその場で反映される
(本文の打ち替えだけ「反映」が要る)。
レイヤは複数選べる (Ctrl+クリックで足す/外す、Shift+クリックで範囲)。2 枚 以上選ぶと右ペインが一括操作に変わり、初期書式 (フォント / サイズ / 色 / B・I・U / 行揃え) の一括変更、書式のコピー & 貼り付け、名前に prefix を付けたまとめて 複製、選択ぶんだけの CSV 書き出しができる。複製ではマスクも一緒に複製される ので、言語別レイヤの下地づくりに使える (複製したものがそのまま選択状態になるので、 続けてフォントを一括で変えられる)。
左ペイン下の ▲▼ は同じ階層の中での並べ替え (フォルダは中身ごと動く)。 複製 は名前と本文をその場で決められるので、本文を書き換えれば実質 「新規テキストレイヤの追加」になる。
テキストレイヤの位置と流し込み枠は、右ペインの数値欄・プレビュー上の ドラッグ・矢印キー (Shift で 10px) のどれでも変えられる。位置を動かすと PSD 内蔵のラスタも一緒に動くので、Photoshop で描き直すまでの間も見た目が ずれない。
レイヤ名の変更は、ツリーの名前をダブルクリックするか、選択して F2
(または「名前」ボタン)。Enter で確定、Escape で取り消し。テキストレイヤ以外
にも使える。
フォント選択の一覧は日本語名で出る (フォントファイルから読んでいる)。
右側に PSD が実際に指す PostScript 名が並び、どちらの名前でも検索できる。
★ を押すとよく使うフォント (プリセット) に入り、次から一番上に出る。
プリセットは名前を付けて増やせるので、案件ごとに分けられる。
ウィンドウの大きさと位置は覚えていて、次に開いたとき同じ場所に出る (ブラウザがすでに起動している場合は、窓を作るのがブラウザ側なので効かない ことがある)。
psdtext を終了するとブラウザ側の画面も自動で閉じる (閉じられないブラウザでは 「終了しました」と大きく出す)。開きっぱなしの画面が溜まって、どれが生きている のか分からなくなるのを防ぐため。
保存時、元ファイルは <name>.psd.bak へ退避される (既存の .bak は上書きしない)。
別名で保存したい場合は保存ダイアログでパスを入れる。
「CSV 書き出し」の既定の書き出し先は PSD と同じフォルダ の
<名前>_texts.csv。読み込むときも同じパスが最初から入っているので探さなくて
よい (ブラウザにダウンロードすることもできる)。CSV は画面へドロップしても
読み込める。
書き出しは UTF-8 (BOM 付き / CRLF) で Excel でそのまま開ける。読み込みは Excel が既定で保存する Shift-JIS もそのまま読める (どちらとして読んだかは 結果に出る)。「反映する」は変更のある行が無いと押せず、その理由も表示される。
形式は次のとおり:
lyid,path,font,size,color,align,text,tags
2,"dialog/名前",NotoSansJP-Bold,48,#202020,left,"こんにちは",
4,"dialog/本文",NotoSansJP-Regular,32,#202020,center,"1 行目
2 行目",- 初期書式は列に分かれている (font / size / color / align)。本文と同じセルに タグが混ざらないので、Excel 上で列ごと掴んで一括で扱える
text列は素の本文。セル内改行がそのまま PSD の段落区切りになるtags列は本文の途中に書式指定がある行だけ埋まる (従来のタグ表現)。 読み込むとき、本文を書き換えていない行は途中の書式もそのまま残り、 書き換えた行は「初期書式 + 素の本文」になる- 空欄の列は「今のまま」。
alignはleft/right/centerのほか 「左」「右」「中央」でも書ける - 昔の形式 (
textにタグを畳んだ CSV) もそのまま読める - 照合は
lyid(Photoshop の永続レイヤ ID) が主キー。レイヤの並べ替えや 改名をしても対応が壊れない。lyidが無い行はpath列で照合する (同名レイヤが複数あるときは曖昧なので未解決として報告する) - 列の順序は自由で、余分な列があっても無視される
「CSV 読み込み」は最初に確認だけを行い、変更 / 同一 / 未解決の件数と内訳を 表示する。内容を確認してから「反映する」を押すと文書へ取り込まれる (この時点ではまだメモリ上。ファイルへ書くのは「保存」)。
PSD のテキストレイヤは「ラン (連続する文字に同じ書式)」の並びで書式を持つが、
CSV のセルには構造を入れられない。そこで本文の中にタグを埋め込む形で 1 本の
文字列に畳んでいる。編集欄ではこのタグを ◆ の札として見せているので、
タグを直接目にするのは CSV と API だけ。
text test [color=#F6005D]テキスト
[align=right][b]TEST[font=SourceHanSansJP-Normal][size=33.3333][color=#0017F6][/b]フォント[size=50]変更
[align=center][font=HGPKyokashotai]別のフォント
閉じタグは無い。 タグはその位置から先の状態を変え、次の指定まで効き続ける。 PSD のランは入れ子ではなく平坦な並びなので、この形が構造にそのまま対応し、 翻訳者が入れ子を壊す事故も起きない。
| タグ | 効果 |
|---|---|
[font=名前] |
そこから先のフォント。PSD に無い名前は FontSet へ追記される |
[size=48] |
文字サイズ (px)。小数可 |
[color=#FF0000] |
文字色 |
[b] [i] [u] |
太字 / 斜体 / 下線を on |
[/b] [/i] [/u] |
同じく off |
[/font] [/size] [/color] |
その属性を基準 (先頭ランの書式) へ戻す |
[reset] |
全属性を基準へ戻す |
[align=left|right|center] |
段落の行揃え。段落の先頭に置く |
[[ |
リテラルの [ |
- 書式が一様なテキストにはタグが 1 つも付かないので、普通の翻訳作業では タグを意識しなくてよい
- 基準は読み込んだ時点の先頭ランの書式で、編集しても動かない。
[/color]は いつでも「開いたときの色」を指す。初期書式を変えるというのは、この基準の上に 先頭のマークを重ねること (だから「元に戻す」で必ず元の書式へ帰れる) - 範囲に書式を付けるときも閉じタグは作らず、**範囲の終わりに「元の書式へ戻す マーク」**を置く。戻し先は直後に効いていた書式そのものなので、地の書式が 何であっても壊れない
- 未知のタグはそのままの文字として残る (壊れた入力で本文を失わない)
- 生成された表現は往復で完全に安定 (編集 → 保存 → 開き直しで同じ文字列)
CSV では初期書式が列に分かれ、この形式が入るのは tags 列 (本文の途中に書式が
ある行だけ) になる。
CMake 3.16+ と C++17 コンパイラだけあればよい。依存 (appserve / psdparse / zlib) は CMake が自動で取得する。
cmake --preset windows # MSVC (Developer Command Prompt から)
cmake --build --preset windows-relappserve や psdparse に手を入れながら開発する場合、../appserve /
../psdparse にチェックアウトがあれば自動でそちらが使われる (取得より優先)。
明示するときは:
cmake --preset windows -DPSDTEXT_APPSERVE_DIR=D:/test/appserve \
-DPSDTEXT_PSDPARSE_DIR=D:/test/psdparseweb/ を編集した場合はブラウザをリロードするだけで反映される
(開発中はカレント/exe 隣の web/ が、リリース時は exe 埋め込み zip が使われる)。
すべて X-App-Token ヘッダが要る (起動時に払い出され、UI へは URL 経由で渡る)。
| ルート | 説明 |
|---|---|
POST /api/psd/open |
{path} を開く。文書情報 + ツリー + テキスト一覧を返す |
GET /api/psd/info |
開いている文書の概要 (パス / レイヤ数 / 未保存件数) |
GET /api/psd/tree |
全レイヤ (index / lyid / parent / depth / kind / rect) |
GET /api/psd/texts |
テキストレイヤ一覧 (本文 / 基準の書式 (フォント・サイズ・色・B/I/U) / 行揃え / dirty) |
POST /api/psd/text |
{index, text} で本文を差し替える |
POST /api/psd/revert |
{index} を読み込み時の内容へ戻す |
POST /api/psd/name |
{index, name} でレイヤ名を変更 |
POST /api/psd/align |
{index, paragraph?, align} で行揃えを変更 (paragraph 省略で全段落) |
POST /api/psd/duplicate |
{index, name?, text?} でレイヤを複製 (本文を変えれば新規追加) |
POST /api/psd/move |
{index, direction} で同じ階層内をひとつ上/下へ (フォルダは中身ごと) |
POST /api/psd/place |
{index, dx, dy} で移動 / {index, width, height} で流し込み枠 |
POST /api/psd/save |
{path?, backup?} で保存 (path 省略で上書き) |
GET /api/psd/image?index=N |
レイヤの見た目を生 RGBA で返す (X-Image-Width/Height) |
GET /api/psd/export |
テキストを CSV でダウンロード |
POST /api/psd/export |
{path?, indices?} で CSV をファイルへ書き出す (既定は PSD の隣) |
POST /api/psd/import |
CSV を取り込む。生バイト / {csv} / {path} のどれでも可。?apply=0 で確認のみ |
GET /api/app/settings |
画面をまたいで残す設定 (前回のフォルダ等) |
POST /api/app/settings |
渡したキーだけ上書きする |
ファイル選択用に appserve 標準の /api/fs/* も使える。
--repl (対話) / --replfile=DIR (エージェント) / POST /_app/repl (curl)。
| コマンド | 説明 |
|---|---|
.psd |
開いている文書の情報 |
.texts |
テキストレイヤ一覧 (* が未保存) |
.settext <index> <text> |
本文を差し替える |
.b state |
ブラウザ側 UI の状態を覗く |
.b call select 3 |
UI の選択を動かす |
.b call lang ja |
表示言語を切り替える |
.b call marks |
書式マークの構成 (基準 / 本文 / マーク一覧) を覗く |
.b call marksel base |
書式パネルの編集対象を選ぶ ({"mark":2} / {"range":[5,9]} / {"at":10}) |
.b call fmt {"color":"#FF0000"} |
いまの対象へ書式を入れる (値 / null = 基準へ戻す / "keep" = 指定を消す) |
詳細は appserve の docs/REPL.md。
- 対象は既存のテキストレイヤの本文。新規テキストレイヤの追加は行わない
- テキストレイヤの追加は既存レイヤの複製が土台 (Photoshop が受け付ける構造を 確実に保つため)。書式と位置は複製元を引き継ぎ、テキストレイヤが 1 枚も無い PSD には追加できない
- 位置と流し込み枠を変えられるのはテキストレイヤだけ。画像レイヤの移動や 拡大縮小は Photoshop 側で行う
- テキストの回転・変形はできない (変換行列のうち移動成分だけを扱う)
- 重ね順の変更は同じ階層の中だけ。フォルダへの出し入れはできない
- 合成プレビュー画像は編集後も古いまま。Photoshop で開き直すと再合成される
- テキストの流し込み枠 (bounds) は変えないので、長くすると枠からはみ出る
appserve_package() (appserve 提供) で zip / インストーラを作る。タグを打つと
GitHub Actions が Release を自動生成する。
cmake --build --preset windows-rel
cpack --config build/windows/CPackConfig.cmake -C Release -B dist # 手元で作る
git tag v0.3.0 && git push origin v0.3.0 # リリースする配布物は psdtext.exe + README + LICENSE の 3 つだけ。UI は exe に埋め込まれ、
依存 (appserve / psdparse / zlib) は静的リンクされるので DLL は要らない。
リリースの再現性を確保したいときは依存をタグに固定する:
cmake -B build -DPSDTEXT_APPSERVE_TAG=v0.1.0 -DPSDTEXT_PSDPARSE_TAG=v0.9.0詳細は appserve の docs/RELEASE.md。
MIT