終了

コピーを保存(複製を保存)をJavascriptで自動化

Community Beginner ,
Dec 20, 2023 Dec 20, 2023

リンクをクリップボードにコピー

コピー完了

お世話になります。

 

左上メニューバーのファイル

コピーを保存(複製を保存 という名前だったころもあったような)

PDF書き出し 

 

を自動化したスクリプトを作りたいと考えています。

いろいろ調べたり試したりしたのですがうまくできず、お知恵をお貸しくださいますと幸いです...。

 

【目指しているスクリプト】

・全てのアクティブドキュメントを、デスクトップにPDF保存する

・書き出すPDFのファイル名はaiと同名

・可能であれば、書き出す際に元aiファイルを上書きしない

・PDFプリセットはスクリプト内で指定する

・PDFのセキュリティ設定もスクリプト内で指定する(options.documentPassword などの

・元aiファイルを閉じない

___

 

 

【参考にさせていただき、試した方法】

https://sttk3.com/blog/tips/illustrator/export-pdf.html

→スクリーン用に書き出しでは、セキュリティ設定ができなさそう(?)

 

https://community.adobe.com/t5/illustrator-discussions/quot-save-a-copy-quot-scripting-problem/m-p/9...

→元ファイルをセーブしてしまうのと、アクティブドキュメントの数だけ繰り返しが上手く指定できず...

 

プログラミング経験のないデザイナーが独学でスクリプトを書いているので、調べ方やツールの使い方などが至らず、うまく情報に辿り着けていないのかもしれません。

お手をわずらわせ恐縮ですが、何卒よろしくお願いいたします。

キーワード
Mac , スクリプティング

表示

1.5K

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines

correct answers 1 件の正解

Community Expert , Dec 22, 2023 Dec 22, 2023

調べてみましたが、難しいけど経路次第では実現可能の印象を持ちました。

 

【実現可能】

  • 全てのアクティブドキュメントを、デスクトップにPDF保存する
  • 書き出すPDFのファイル名はaiと同名

 

【exportForScreens、または複製を保存(アクション)でのみ実現可能】

  • 書き出す際に元aiファイルを上書きしない
  • 元aiファイルを閉じない

 

【別名で保存でのみ実現可能】

  • PDFのセキュリティ設定もスクリプト内で指定する(options.documentPasswordなどの)

 

開いている書類の参照が書き出したPDFに持っていかれても構わないなら、単にsaveAsにPDFオプションを渡してたくさん書き出すだけで済みます。

 

「複製」の動作にこだわり、かつパスワードをスクリプトで指定する場合は次のような流れになるはずです。

  1. exportForScreensまたは複製を保存(アクション)で、一旦編集可能な書類を書き出す
  2. 書き出した1の書類を開く
  3. 開いた1の書類をsaveAsでPDFとして書き出す。パスワードはここで指定する
  4. 1の書類を保存せずに閉じる
  5. 1の書類ファイ
...

投票

翻訳

翻訳
Community Expert ,
Dec 20, 2023 Dec 20, 2023

リンクをクリップボードにコピー

コピー完了

あ、「アクティブドキュメント」は、最前面ドキュメントを指します。

それ以外は単なる「ドキュメント」です。スクリプト上でもそう呼びます。

 

https://community.adobe.com/t5/illustrator-discussions/jsx-make-document-copy-using-document-saveas-...

こちらのスレッドで正解もらってるのが、参考リンクのしたたか企画さんですね。

手順としては、

・「コピーを保存」をアクションに記録

・記録されたアクションをエクスポート(.aiaファイル)

・aiaファイルを関数化して、必要なパラメータ(保存オプション)を引数にする

のあと、

・開かれたドキュメント群をループ処理

・引数をととのえて関数を実行する

・くりかえし

 

といった流れになるかと思います。ちょっと何言ってるかわかりませんね。

とりあえず.aia ファイルをエディタで開いてみてください。それで何か見えてくるか、何かやれそうか。

そこでわからなかったらまたきいてください。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Dec 21, 2023 Dec 21, 2023

リンクをクリップボードにコピー

コピー完了


ご回答の内容が、正直なところ理解が及ばず、解決できなかったのですが
取り急ぎご回答へのお礼をさせてください。

 

ご回答ありがとうございます。

 

また、アクティブドキュメントとドキュメントの表記についてもご指摘ありがとうございます。おかげさまで一つ知識が増えました。

わからない箇所を2つにまとめたのですが、ご質問させていただいてもよろしいでしょうか。


1,aiaファイルの関数化について、詳細をご教示いただけませんでしょうか。

aiaファイルの中身をjsxファイルに持ってきてfunctionに入れるのかと思いましたが、構文エラーで動きませんでした...。


2, aiaファイルの読み解き方について
パラメータ13(
/key 1851878757)に保存ファイル名や保存先を指定できそうでした。
他にもいくつか
/type (ustring)のパラメータがありますが

こちらのvalueは全て16進数で記載するのでしょうか。

その場合の手順は

アクティブドキュメントのファイル名とファイルの場所を取得

スクリプト内で16進数に変換
16進数に変換した値をパラメータ13(/key 1851878757)のvalueに渡す


という流れになりますでしょうか。


とんちんかんなことを言っていましたら申し訳ありません。

今回の内容は想像よりレベルが高く、リファレンスを探っては、頭から煙を出しております。
なにとぞよろしくお願いいたします。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Dec 21, 2023 Dec 21, 2023

リンクをクリップボードにコピー

コピー完了

リンク先のリンク先で、その16進変換についてのやりとりが見られますが、まとまったのかそうでないのか、ちょっとわかりにくいですね…

 

すみませんすこし記憶違いがありました。実際もうちょっとだけ複雑な運用でした。

アクションパネルに登録済みのアクションを実行するのですが、保存ファイル名など毎回のパラメータが異なる場合は、

・アクションファイルをデスクトップなどに作成(aiaファイル)

・アクションを読み込む(aiaから)

・アクションを実行

・アクションを(パネルから)削除

・aiaファイルを削除

という流れが必要でした。すみませんいま思い出しました。

 

このため、最初に

・ファイルAを「コピーを保存」したアクションAを記録

・ファイルBを「コピーを保存」したアクションBを記録

・「アクションの保存」でaiaファイルを保存

・アクションAとアクションBのテキスト差分をとり、パラメータが書かれている場所(今回だと保存先)を特定 ※

・パラメータ位置より前のテキスト、後のテキスト、分ける(とりあえずで)

・保存先(ファイルパス:置き場所からファイル名までのひとつの文字列)をhex変換

・前のテキスト + 保存先 + 後のテキスト でアクションファイル作成

という関数が必要となります。

 

過去の案件からサンプル出したかったのですが、どこにやったか……

先にお茶濁しで、パラメータ変動なしのものが見つかったので出してみます。

// アクションセットとアクションをつくる関数
// 見やすさ目的で、[文字列, 文字列, 文字列...] の配列で宣言して、
// 最後に join()でひとつの文字列にしてあります
function addActionSet(){

    var actionCode = ["/version 3",
    "/name [ 7",
    "	6d79546f6f6c73",
    "]",
    "/isOpen 0",
    "/actionCount 1",
    "/action-1 {",
    "	/name [ 27",
    "		e8a487e59088e382b7e382a7e382a4e38397e38292e68ba1e5bcb5",
    "	]",
    "	/keyIndex 0",
    "	/colorIndex 0",
    "	/isOpen 0",
    "	/eventCount 1",
    "	/event-1 {",
    "		/useRulersIn1stQuadrant 0",
    "		/internalName (ai_expand_compound_shape)",
    "		/localizedName [ 27",
    "			e8a487e59088e382b7e382a7e382a4e38397e38292e68ba1e5bcb5",
    "		]",
    "		/isOpen 0",
    "		/isOn 1",
    "		/hasDialog 0",
    "		/parameterCount 1",
    "		/parameter-1 {",
    "			/key 2020634212",
    "			/showInPalette 4294967295",
    "			/type (integer)",
    "			/value 0",
    "		}",
    "	}",
    "}"].join("\n");
        // aiaを保存
	var tmp = File(Folder.desktop + "/myActions.aia"); // myActionsがアクションセット名
	tmp.open('w');
	tmp.write(actionCode); // 上で宣言したアクションの文字列を書き込み
	tmp.close();
	app.loadAction(tmp); // appにアクションセットを読み込み
	tmp.remove(); // 読み込み終わったのでaiaファイルを削除
}

// アクション実行の関数
function expandPluginShape(){
    try{
        app.doScript("複合シェイプを拡張", "myActions", false); // アクション実行してみる
    } catch(e){
        addActionSet(); //エラー(アクションがない)ためアクション作成(上の関数を実行)
        app.doScript("複合シェイプを拡張", "myActions", false);
    }
}

expandPluginShape(); //アクション実行する関数を実行

 

この間に、もっと詳しく親切なTen Aさんやsttk3さんたちが全部教えてくださる予感もしますが、

いちおう過去案件を探ってきます。

成功をお祈りしてます。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Dec 27, 2023 Dec 27, 2023

リンクをクリップボードにコピー

コピー完了

詳しくありがとうございます。理解に時間がかかり、ご返信が遅くなってしまいました。

今回、皆様にいただいたアドバイスを参考に
exportForScreensでデスクトップにPDF保存
②そのPDFをapp.openで開く
③開いているファイルの中から拡張子PDFのものだけ、セキュアな設定でSaveAsで保存

のようなフローを考え、コードを書いて実験していたのですが、その過程で
「exportForScreensでもセキュリティ設定は可能」ということがわかりました。

(①exportForScreensでデスクトップにPDF保存 の際に、間違って鍵付きPDFのプリセットを指定してしまい、 ②そのPDFをapp.openで開く の際に、パスワードを求められて気がつきました。)


aiaファイルのスクリプトでの編集はすぐ必要な場面はないものの、知っていて損はない知識なので、これを気に少し触ってみようと思います。(←複製保存のaiaファイルを触ってみましたが、長いアクションは地味に大変ですね)
ありがとうございました。



投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Dec 21, 2023 Dec 21, 2023

リンクをクリップボードにコピー

コピー完了

なんでアクションに行っちゃうのかという点はアレなんですけど、

/localizedName [ 18
e794bbe5838fe38388e383ace383bce382b9

このあたりの読み解き方は18バイトマルチバイト言語であればUTF-8コードとして文字を抽出・書き戻しでOKです。他にbool、int、real、など一般的なパラメータがありますが、本質的なことを言うとPDFSaveOptions書こうよってことで…

var opt = new PDFSaveOptions();
opt.compatibility = PDFCompatibility.ACROBAT5;
opt.pDFXStandard = PDFXStandard.PDFXNONE;
opt.pDFXStandardDescription = "Test SaveOptions." ;
opt.preserveEditability = true;
opt.generateThumbnails = true;
opt.optimization = true;
opt.viewAfterSaving = false;
opt.colorCompression = CompressionQuality.AUTOMATICJPEGMAXIMUM;
opt.colorTileSize = 256;
opt.colorDownsamplingMethod = DownsampleMethod.BICUBICDOWNSAMPLE;
opt.colorDownsampling = 400;
opt.colorDownsamplingImageThreshold = 400;
opt.grayscaleCompression = CompressionQuality.AUTOMATICJPEGMAXIMUM;
opt.grayscaleTileSize = 256;
opt.grayscaleDownsamplingMethod = DownsampleMethod.BICUBICDOWNSAMPLE;
opt.grayscaleDownsampling = 400;
opt.grayscaleDownsamplingImageThreshold = 400;
opt.monochromeCompression = MonochromeCompression.CCIT4;
opt.monochromeDownsamplingMethod = DownsampleMethod.SUBSAMPLE;
opt.monochromeDownsampling = 1200;
opt.monochromeDownsamplingImageThreshold = 1200;
opt.compressArt = true;
opt.trimMarks = true;
opt.registrationMarks = true;
opt.colorBars = true;
opt.pageInformation = false;
opt.pageMarksType = PageMarksTypes.Japanese;
opt.trimMarkWeight = PDFTrimMarkWeight.TRIMMARKWEIGHT0125;
opt.offset = 0;
opt.bleedOffsetRect = [8.49858 ,8.49858,8.49858,8.49858];
opt.bleedLink = true;
opt.colorConversionID = ColorConversion.None;
opt.colorDestinationID = ColorDestination.None;
opt.colorProfileID = ColorProfile.None;
opt.trapped = false;
opt.fontSubsetThreshold = 80;
opt.printerResolution = 800;
opt.acrobatLayers = false;
opt.requireDocumentPassword = true;
opt.documentPassword = "test" ;
opt.requirePermissionPassword = true;
opt.permissionPassword = "test" ;
opt.pDFAllowPrinting = PDFPrintAllowedEnum.PRINT128HIGHRESOLUTION;
opt.pDFChangesAllowed = PDFChangesAllowedEnum.CHANGE128ANYCHANGES;
opt.enableCopy = true;
opt.enableAccess = true;
opt.enablePlainText = false;
opt.enableCopyAccess = true;
opt.typename = PDFSaveOptions;
var pdfFile = new File(app.activeDocument.path + "/" + app.activeDocument.name.split('.')[0] + '.pdf');
app.activeDocument.saveAs(pdfFile, opt);

と、まあ、適当に全部設定して喰わせれば良いです。
それから、以前書いたやつなんでテストしてないです。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Dec 21, 2023 Dec 21, 2023

リンクをクリップボードにコピー

コピー完了

>なんでアクションに行っちゃうのか

 

↓これで

>可能であれば、書き出す際に元aiファイルを上書きしない

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Dec 27, 2023 Dec 27, 2023

リンクをクリップボードにコピー

コピー完了

ご返信ありがとうございます。

いただいたアドバイスを参考にスクリプトを検証していた結果、アクションを使わずに解決できてしまいました...。m(__)m
(①exportForScreensでデスクトップにPDF保存
②そのPDFをapp.openで開く
③開いているファイルの中から拡張子PDFのものだけ、セキュアな設定でSaveAsで保存

のようなフローを考え、実験していたのですが、その過程で
「exportForScreensでもセキュリティ設定は可能」ということがわかりました。

(①exportForScreensでデスクトップにPDF保存 の際に、間違って鍵付きPDFのプリセットを指定してしまい、 ②そのPDFをapp.openで開く の際に、パスワードを求められて気がつきました。)

今後は自分で実行できなそうと思った処理も、一度試してみてから質問しようと思います。
ありがとうございました。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Dec 22, 2023 Dec 22, 2023

リンクをクリップボードにコピー

コピー完了

調べてみましたが、難しいけど経路次第では実現可能の印象を持ちました。

 

【実現可能】

  • 全てのアクティブドキュメントを、デスクトップにPDF保存する
  • 書き出すPDFのファイル名はaiと同名

 

【exportForScreens、または複製を保存(アクション)でのみ実現可能】

  • 書き出す際に元aiファイルを上書きしない
  • 元aiファイルを閉じない

 

【別名で保存でのみ実現可能】

  • PDFのセキュリティ設定もスクリプト内で指定する(options.documentPasswordなどの)

 

開いている書類の参照が書き出したPDFに持っていかれても構わないなら、単にsaveAsにPDFオプションを渡してたくさん書き出すだけで済みます。

 

「複製」の動作にこだわり、かつパスワードをスクリプトで指定する場合は次のような流れになるはずです。

  1. exportForScreensまたは複製を保存(アクション)で、一旦編集可能な書類を書き出す
  2. 書き出した1の書類を開く
  3. 開いた1の書類をsaveAsでPDFとして書き出す。パスワードはここで指定する
  4. 1の書類を保存せずに閉じる
  5. 1の書類ファイルを削除する

 

複製を保存(アクション) aiaに書き出し先ustringを渡す場合は、16進数に変換するだけでなく、そのバイト数?も記載する必要があります。このページのustringというfunctionを参考にしてください。
【解決】スクリプトでのアクション動的生成を簡単にしたい!

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Dec 27, 2023 Dec 27, 2023

リンクをクリップボードにコピー

コピー完了

ご回答ありがとうございます。

皆様にいただいたアドバイスを参考に
exportForScreensでデスクトップにPDF保存
②そのPDFをapp.openで開く
③開いているファイルの中から拡張子PDFのものだけ、セキュアな設定でSaveAsで保存

のようなフローを考え、コードを書いて実験していたのですが、その過程で
「exportForScreensでもセキュリティ設定は可能」ということがわかりました。

(①exportForScreensでデスクトップにPDF保存 の際に、間違って鍵付きPDFのプリセットを指定してしまい、 ②そのPDFをapp.openで開く の際に、パスワードを求められて気がつきました。)

せっかくaiaファイルの編集などハイレベルな知識をご教示いただいたものの、
解決が想像よりずっと簡単なところにあり、なんだか申し訳ない気持ちです。

今後は、実行できなそうと思った処理も、一度試してみてから質問しようと思います。
ありがとうございました。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Dec 27, 2023 Dec 27, 2023

リンクをクリップボードにコピー

コピー完了

最新

そうですね。パスワードがいつも同じで構わないならプリセットを指定するだけで済みます。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines