PDF に変換する

味も素っ気もない記事名ですね。

/Library/Scripts/printing Scripts の中に Finder で選択している項目を PDF に変換するスクリプトがあります。これが動かない。

なんでかな、と試行錯誤してやっと分かりました。変換対象のファイルへのパスに日本語が含まれていると変換に失敗するんですね。もちろん、ファイル名に日本語を使っていてもだめ。ファイルの中身が日本語かどうかやエンコーディングが何かといったことは関係ないっぽい。

パスに日本語が入っているとだめということなら、それなりの対処をすればいいだけでなんとか使えるようになりました。

しかし、この変換を行っているコマンドって RTF かテキストファイル(他にもいくつかの画像タイプに対応しているようですが、書類関連ではということです)しか変換できないのですね。画像が入っている RTFD ファイルなんかは変換できないし、Safari で保存した Web アーカイブなんかも変換できない。せめて、RTFD だけでも PDF に変換してほしいものです。

property typeList : {"TEXT"}
property extensionList : {"rtf", "txt"}
property tmpFolder : path to temporary items folder from user domain

(*
Usage: /System/Library/Printers/Libraries/convert
    [-f <input filename>]
    [-o <output filename>]
    [-i <input mimetype>]
    [-j <output mimetype>]
    [-P <PPD filename>]
    [-u]
    [-a <attribute string>]
    [-U <username>]
    [-J <jobname>]
    [-c <copies>]
    [-D]
*)

tell application "Finder"
    set curSelection to selection

    set processFiles to {}
    repeat with thisItem in curSelection
        if not (class of thisItem is folder) then
            if (name extension of thisItem is in extensionList or file type of thisItem is in typeList) then
                set end of processFiles to thisItem as alias
            end if
        end if
    end repeat
    if processFiles is {} then return

    repeat with thisItem in processFiles
        set inFile to my duplicateFile(thisItem)
        set outFile to (tmpFolder as Unicode text) & "out.pdf"
        my convertPDF(POSIX path of inFile, POSIX path of outFile)
        set fileName to (my trimExtension(thisItem) & ".pdf") as Unicode text
        set name of (outFile as alias) to fileName
        set parentFolder to my dirName(thisItem)
        move (((tmpFolder as Unicode text) & fileName) as alias) to parentFolder replacing yes
    end repeat
end tell

on duplicateFile(theFile)
    set tmpFile to "process_file"

    tell application "Finder"
        if (file tmpFile of tmpFolder exists) then
            move file tmpFile of tmpFolder to trash
        end if
        set copiedFile to duplicate theFile to tmpFolder replacing yes
        set name of copiedFile to tmpFile
        return (file tmpFile of tmpFolder) as alias
    end tell
end duplicateFile

on convertPDF(inFile, outFile)
    set converter to "/System/Library/Printers/Libraries/convert "
    set mime to "'application/pdf'"

    set theCommand to converter & "-f " & (quoted form of inFile) & " -o " & (quoted form of outFile) & " -j " & mime
    try
        do shell script theCommand
    on error eMessage number enumber
        return {enumber, eMessage}
    end try
end convertPDF

on trimExtension(theFile)
    set {name:fileName, name extension:theExtension} to info for theFile
    if theExtension is missing value then set theExtension to ""
    set fileCharNum to count fileName
    set exCharNum to count theExtension
    if exCharNum is not 0 then
        return text 1 thru (fileCharNum - exCharNum - 1) of fileName
    end if
    return fileName
end trimExtension

on dirName(theFile)
    tell application "Finder" to ((container of file theFile) as alias) as Unicode text
end dirName