pdffontsの実行結果をサブテーブルに登録する(1)
こんにちは。サイボウズ株式会社 開発本部 People Experienceチームの貴島(@jnkykn)です。西原(@tomio2480)さんといっしょに活動している「スライドをよくする会」の一環として、チェック対象のスライドのpdfファイルのpdffonts実行の自動化に取り組んでいます。
前回、pdffontsの実行結果をそのまま対象レコードに反映できたので、実行結果をフォント名、フォントタイプ、などのサブテーブルに登録したいと思います。
実行結果のテキストからサブテーブルのカラムデータを抜き出したい
pdffontsの実行結果のうち、各フォントの情報部分をサブテーブル用の元データにできると良いと考え処理を追加しました。ところが、pdffontsを子プロセスで実行すると、pdfファイルが存在しないため実行エラーが発生しました。
$ node fetchPDF.js
SET TOKEN
getRecords 3 records
拡張子: pdf
fetch start Chrome拡張MV3について.pdf contentType:application/pdf
拡張子: md
拡張子: json
onRejected reason Error: Command failed: pdffonts temp/Chrome拡張MV3について.pdf > temp/Chrome拡張MV3について.txt
I/O Error: Couldn't open file 'temp/Chrome<e6><8b><a1><e5><bc><b5>MV3<e3><81><ab><e3><81><a4><e3><81><84><e3><81><a6>.pdf': No such file or directory.
pdffonts 成功 => temp/Chrome拡張MV3について.txt
ファイル書き出しOK=>Chrome拡張MV3について.pdf
pdfファイルは本当にダウンロードできていないのか?
前回、PDFファイルのダウンロードはできていたので、postmanでAPI実行を確認してみました。
PDFファイルを取得するところまではOKなので、pdffontsの実行結果を編集する関数を追加したところを一旦もとに戻してみます。
まだ非同期処理と向き合う必要がある
実行ログをよく見ると、PDFファイルは取得できているけれど、ファイルの保存前にpdffontsを実行しているようです。やはり、ここは非同期処理の順番が肝ということがわかりました。Promiseの状態が完了になってから次の処理を実行したいと思って調べていたところ、JavaScriptの非同期処理を理解する その2 〜Promise編〜という記事を見つけました。メソッドチェーンで、解決できそうな気がします。まずは、関数の呼び出し順をメソッドチェーンで書き換えてみました。
record.records.map(
(record) => {
// ファイルの取得
const { fileKey, name, contentType } = record['pdf'].value[0];
// 拡張子がpdfだったら、ダウンロードしてpdffonts実行
const extention = (name.split('.').slice(-1)[0]).toLowerCase();
console.log(`拡張子: ${extention}`);
if( extention === 'pdf'){
const fullPath = `temp/${name}`;
const resultPath = fullPath.replace(".pdf", ".txt");
const gotFile = getFile(fileKey, name, contentType)
.then(() => {
// ファイルが取得できたら、pdffontsの実行
return runPfdfonts(fullPath, resultPath);
}).then(() => {
// pdffontsの実行に成功したら、結果反映とステータス更新
return updateAppRecord(client, APP_ID, record.$id.value, resultPath);
}).catch((err) => {
console.error(`実行失敗 :\n${err.message}`);
});
}
}
)
まだ、各メソッドの方は修正していないのですが、この状態で実行してみます。
$ node fetchPDF.js
SET TOKEN
getRecords 3 records
拡張子: pdf
fetch start Chrome拡張MV3について.pdf contentType:application/pdf
拡張子: md
拡張子: json
ファイル書き出しOK=>Chrome拡張MV3について.pdf
onRejected reason Error: Command failed: pdffonts temp/Chrome拡張MV3について.pdf > temp/Chrome拡張MV3について.txt
Syntax Error: Couldn't find trailer dictionary
Syntax Error: Couldn't find trailer dictionary
Syntax Error: Couldn't read xref table
ID10 : 結果ファイルの読み込み temp/Chrome拡張MV3について.txt
An error occurred in updateAppRecord!
ENOENT: no such file or directory, open 'temp/Chrome%E6%8B%A1%E5%BC%B5MV3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.txt'
実行失敗 :
ENOENT: no such file or directory, open 'temp/Chrome%E6%8B%A1%E5%BC%B5MV3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.txt'
Promiseの状態変化のチェックが入っていないので、pdfファイルの保存の確認ができていない状態ですが、実行順は期待通りです。
というところで、時間切れ。今日は、ここまでにします。次回は、各関数のPromiseの状態をチェックして、完了したら次の関数が実行されるようにしたいと思います。