:note

エラー処理について考えてみる

行くことはできないのですがDTP Booster 13(Omotesando / 20100602)に出演される、たけうちとおるさんからのお題が出題されていたので解いてみました。 DTP Booster 13のお題 - たけうちとおるのスクリプトノート

「開いているドキュメントをすべてPDF書き出しする」スクリプトを作って下さい。
  • 書き出されるPDFはドキュメントと同じファイル名で(拡張子が.pdfになる)同一階層に保存されるとします。
  • PDF書き出しプリセットは「PDFx/1-a」です。
  • PDFを書き出したドキュメントは保存せずに閉じます。
  • 20行以内で出来ると思います。
  • 多少のエラー処理はしなくて結構です。

//エラー処理しない
var doc = app.documents;
var pdfPreset = app.pdfExportPresets.item("PDFx1-a");
for(var i=doc.length-1; i >= 0; i--){
  var pdfPath = doc[i].fullName.toString().replace( /\.indd$/, ".pdf" );
  var pdfFile = new File(pdfPath);
  doc[i].exportFile (ExportFormat.PDF_TYPE, pdfFile, false, pdfPreset);
  doc[i].close (SaveOptions.NO);
}

エラー処理をまずいっさい考えずに、書いてみてせっかくなので、省略したエラー処理について考えてみると、いろいろ妄想が広がる。一行目で開かれたドキュメントが存在しているかどうか?二行目でPDF書き出しプリセットが存在しているか?四行目でドキュメントが一度でも保存されているか(保存先のパスが有効か)?五行目でPDF用のパスが有効か?六行目ではtry〜catch(e){}したほうがいいのかな?書き出し失敗したときのアラート出すとか

//エラー処理する
//ドキュメントが開かれているか
if(app.documents.length != 0){
  var doc = app.documents;
  try{//プリセットがあるかどうか?
    var pdfPreset = app.pdfExportPresets.add( {name:"PDFx1-a"} );
  }
  catch(e){
    var pdfPreset = app.pdfExportPresets.item("PDFx1-a");
  }
  for(var i=doc.length-1; i >= 0; i--){
    //一度も保存してないとき
    if(doc[i].saved == false){
      var docPath = File.saveDialog ("save the document");
      if(docPath){
        doc[i].save(new File(docPath));
      }
    }
    //拡張子なしで保存した場合も考慮
    var pdfPath = doc[i].fullName.toString().replace( /($|\.indd$)/, ".pdf" );
    var pdfFile = new File(pdfPath);
    doc[i].exportFile (ExportFormat.PDF_TYPE, pdfFile, false, pdfPreset);
    doc[i].close (SaveOptions.NO);
  }
}
 
comments powered by Disqus
back to top