u゛ノート
きれいな PDF を無料で作る

[警告]この文書は長年更新されていません

 この文書は本来、世の中の現状について解説するために公開しているものであり、 常に現状に追随することが期待されます。
 しかし実際には、最後の更新(ページ末尾に記載)から相当な年月が経過しており、 記載内容は現状に追随していません。 また、この文書を今後更新する予定はありません。
 したがって、この文書は本来の目的を達成していません。 最終更新当時の世の中の様子を伝えるという、 本来とは異なる目的で公開を続けているものです。
 以上の点を理解のうえ、お読みください。

Summary

 PDF 文書は、見るのはタダだが自分で作るには Adobe Acrobat を買わないとダメ、と思っている人は多いと思う。 また、コンピュータにそれなりに詳しい人は「Ghostscript を使えばタダで PDF を生成できる」ということを知っていると思うが、 この方法ではふつうに扱うと文字がビットマップとして埋め込まれ、 仕上がりに難のある場合が多かった。
 そんなわけで、Acrobat を買う気のない私は PDF 作成を半ばあきらめていたのだが、何気なく調べてみたら、 実はそこそこきれいな PDF をタダで作ることは十分可能なのだった。
 ただ、Postscript 方面に疎い私には原理の詳細は分からなかったので、 とにかく「この方法でやればうまくいく」という手順を書いておく。 また、以下ではプラットフォームとして Windows のみを考慮している。


目標

 この文書で目標とするのは以下の4つである。

補足:フォントの埋め込み

 フォントの埋め込みについて補足しておく。
 PDF 文書にはフォントを必要な文字だけ埋め込むことができる。 たとえば丸ゴシック体で「あいうえお」と書かれた5文字の文書なら、 文書作成者のコンピュータにインストールされているフォントファイルから 「あいうえお」の5文字分だけ情報を抜き取って、PDF 文書に埋め込めばよい。 こうすれば、丸ゴシック体のフォントを持っていない人が PDF 文書を読んでも丸ゴシック体で表示/印刷することができる。 文字数が少なければ PDF 文書のサイズはそれほど大きくならないし、 アウトラインフォントを埋め込めば拡大・縮小しても輪郭がギザギザにならない。
 ただ、フォントはだれかの著作物であって、著作者の意向によっては、 文書に埋め込んで再配布してはいけないものもある。 そうでなくても、長文になれば文書中で用いる文字種が増え、 文書中で使う文字だけ埋め込んでもそれなりのサイズになってしまう。
 だから、明朝体とゴシック体という代表的な2種類の字体については、 フォントを埋め込むのではなく、 「ここは明朝体(ゴシック体)でこういう文字が書いてあるので、 表示/印刷する人は、 自分のところにある適当なフォントを使ってくれ」という扱いにするのがよい。


各種ソフトのダウンロード・インストール

 それでは、まず最初に用意するものを列挙する。 各ソフトウェアのインストールは少々ややこしいが、この文書では説明しない。 インストールの際に参考にした文書へのリンクを張っておくのでそれを参照のこと。 私自身、これら親切なページのおかげで前述の目標達成に至っている。

Tips

 GNU patch は環境変数 TMP で指定されたディレクトリに一時ファイルを作るが、 このディレクトリが Windows のインストールされているドライブ(か?)以外に指定されていると動かない。TMP が未設定でも同様のようだ。環境変数 TMP を C:¥WINDOWS¥TEMP にするのが無難。

 また、世の中にはいろいろなバージョンの GNU patch があるが、ものによっては改行コードを LF のみに変換して出力する。今回は CR+LF でも LF でもいいようだ。


基本的な設定・使用方法

 基本的な設定・使用方法は「フリーソフトで PDF を作成する方法」という分かりやすい文書があるので、 これにしたがってやれば、Windows XP の場合にはおおかたの目的は達せられる。 しかし、Windows 9x 系統の場合には細かなちがいがあるので設定方法が変わってくるし、 さらなる設定を行いたい項目もある。

確実にアウトラインフォントを埋め込む

 件の文書は「ライセンスの問題があるかもしれないので、 金輪際フォントを埋め込まない」という方針をとっていて、 フォント埋め込みに関する設定はノータッチになっている。
 ライセンスの問題は重要だが、 埋め込んでも問題のないフォントならば埋め込みたい。 件のページの設定では埋め込みを禁止しているわけではないので、 代替可能でないフォント(日本語でいえば、MS明朝、 MSゴシック以外のフォント)は勝手に埋め込まれるのだが、 埋め込みに関する設定がデフォルトのままなので、 小さな文字がビットマップフォントで表現されてしまう可能性がある。
 そこで、確実にアウトラインフォントを埋め込むための設定を行う。

 コントロールパネルなどから、新たにインストールした「TrueRoad PPD for GS J」というプリンタのプロパティを開く。 ここから先のインタフェースが Windows 9x と Windows XP でまったく異なるというのが困りものだ。
 Windows XP の場合、「全般」タブの「印刷設定」ボタンを押し、 出てきたダイアログの「レイアウト」タブにある「詳細設定」ボタンをさらに押して、 以下の設定を変更する(一部、 フォントの埋め込みに関係のない「気休め設定」も行っている)。

 Windows 9x の場合、プリンタのプロパティを開いたあと以下のように設定する。

Windows 9x ではもう一手間必要

 さて、前述の文書では ps2pdfxx.bat の26行目をいじるよう書いてあるが、Windows 9x でこの書き換えを行うと正常に動かなくなる(「^<」と書いても「<」 がリダイレクト記号として扱われてしまうため)。
 この問題を回避する方法はいろいろ考えられるが、ここでは一例を紹介する。 以下の作業は Windows XP で行っても問題はない。 また、後述の「ちょっと凝った使いかた」をする際には Windows XP でも以下の作業が必須となる。

 まず、以下のような内容のテキストファイル neveremb.txt を作り、適当なフォルダ(ここでは C:¥gs¥gs7.07¥lib とする)に置く。 見やすさのために折り返して表示してあるが、実際には改行せず続けて書く。

-c .setpdfwrite <</NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats /Ryumin-Light /GothicBBB-Medium]>> setdistillerparams

 次に、前述の文書で紹介されている修正を行わないで、ps2pdfxx.bat を以下のように修正する(すでに修正済みなら、さらに以下の修正を加える)。

 「C:¥gs¥gs7.07¥lib¥neveremb.txt」の部分は、 さっき作ったファイルを指すように適宜修正すること。


やっぱりフォントを埋め込みたい?

 これで PDF 文書を作れるようになったはずだが、実際に作ってみると、 レイアウトが少々崩れてしまうことがある。
 少しいじってみたところでは、MS明朝・MSゴシックを用いた Word 文書で凝ったことをしている場合、Postscript レベルでは問題ないのに、PDF に変換したところで崩れるようだ。
 もともとの原因はよく分からないのだが、 常にフォントを埋め込む設定にすればひとまず問題は解決する。PDF のサイズは大きくなってしまうが、短い文書ならそれほど大きな差ではないし、MS P明朝やMS Pゴシックを埋め込んだ PDF 文書など腐るほど配布されているので、MS明朝やMSゴシックを含め、PDF 文書に埋め込んでも実際上の問題はないと推測される。

 常にフォントを埋め込むには、 さっきやったプリンタのプロパティの設定を一部やり直せばよい。
 Windows XP の場合、さっき「デバイス フォントと代替」になっていた場所を「ソフト フォントとしてダウンロード」に変更する。
 Windows 9x の場合、さっき「可能な場合 TrueType フォントをプリンタフォントで置き換える」にチェックが入っていたところを外し、 その下にある「プリンタフォントを使用しない」にチェックを入れる。

 設定の変更はこの1カ所だけなので、ふだんは極力埋め込まない設定にしておき、 レイアウトが崩れたら埋め込むようにする、という方法で対処すればいいだろう。


変換を自動化する

 これまでに説明した(というより説明してもらった)方法では、いったん Postscript 文書を生成したあと、それを手作業で PDF に変換している。が、これは少々めんどうである。
 そこで、「仮想プリンタ」に印刷すると直接 PDF 文書が生成される「ように見える」方法を紹介する。

RedMon のインストール

 まずは、冒頭の「インストールするもの一覧」の最後に書いた 「RedMon」をインストールしよう。この RedMon というツールは「プリンタポートのリダイレクト」を実現するもので、RPT1: などという仮想ポートに印刷データを送ると、 そのデータをそっくり他のプログラムに送りつけたり、 フィルタをかましてから「実プリンタ」に送りつけたりすることができる。
 ダウンロードした ZIP ファイルを適当なところ(C:¥gs の下あたりか)に解凍し、中にある setup.exe を実行する。 一瞬でインストールが終わるが、このあとにけっこうめんどうな設定が必要となる。

ポートの作成

 さっき作った「TrueRoad PPD for GS J」というプリンタのプロパティを開き、 ポートの設定を行うタブ(Windows 9x だと「詳細」タブ)を表示する。 現状では「FILE:」というポートが選択されているはずだが、 ここで「ポートの追加」を選び、「Redirected Port」を選択すると、 「RPT1:」というポートが追加される。
 ポートが追加されたら1つ前に戻って、「TrueRoad PPD for GS J」の接続先ポートとして、作ったばかりの「RPT1:」を選択する。

ポートの設定

 そして、最後にポートの設定。上記の画面で、Windows XP なら「ポートの構成」、Windows 9x なら「ポートの設定」というボタンを押して始める。
 出てきたウインドウには入力項目がいくつかあるので、 それぞれ以下のように設定する。

Redirect this port to the program:
C:¥gs¥gs7.07¥bin¥gswin32c.exe
Arguments for this program are:
-sDEVICE=pdfwrite -dNOPAUSE -dSAFER -dBATCH -dCompatibilityLevel=1.2 -sOutputFile="%1" @C:¥gs¥gs7.07¥lib¥neveremb.txt -f -
Output:
Prompt for filename
Run:
Minimized

 「@C:¥gs¥...」の部分は、この文書の少し前のほうで作った neveremb.txt のことを指している。
 Windows XP でもこのファイルの作成は必須である。「WinXP ならわざわざレスポンスファイルを作らなくても…」と思ったあなた。 中身を展開するとコマンドラインが長くなりすぎて末尾が欠けるのよ、これが。
 また、「1.2」の部分を「1.3」「1.4」にすると、それぞれ Acrobat 4、Acrobat 5 形式の(新しいフォーマットの)PDF 文書ができるが、 ここでは互換性重視で「1.2」にしてある。

 Windows 9x の場合、さらに「詳細」タブにある「スプールの設定」ボタンを押し、 「このプリンタの双方向通信機能をサポートしない」を選択しないとダメなようだ。 Windows XP では同様の設定が自動的に変更不可になるので、気にしなくてよい。

 ここまでの設定を済ませ、「TrueRoad...」という仮想プリンタで文書を印刷すると、 おもむろにファイル名を尋ねられる。 ここで「foo.pdf」のように拡張子まで含めて入力すると、いきなり foo.pdf という PDF 文書ができあがる。


複数の Postscript 文書をまとめて PDF 化する

 最後に、複数の Postscript 文書をまとめて1つの PDF 文書にすることを考える。

Postscript の連結は難しい?

 Postscript 文書の連結はなかなか奥が深い。運がよければ単純に2つのファイルを cat で連結するだけで済む一方、 専用のプログラムを使っても無理ということもある。 文書と言いつつ実はプログラミング言語の一種である Postscript のこと、いろいろ事情はあるのだろう。
 そんな中、私の知る限りでは、最も安定した結果を出せるのが Ghostscript だ。さっきからお世話になりっぱなしのこのプログラム、 複数のファイルを与えるときちんと順番に処理してくれる。Web を検索すると、Ghostscript を使った Postscript の連結方法を書いたページが多く見つかる。
 ただ、それらの方法では「Postscript を根本的に書き直す」ため、 ふつうにやると文字がビットマップに変換されて出てきてしまい、 落胆する結果になる。 適切なオプションをつければ「きれいな連結」は可能なのだろうが、 私にはその方法が分からない。

ps2pdf12.bat を解析する

 ps2pdf12.bat(別に13でも14でも同じだが)に複数の Postscript ファイルを与えることはできないのだろうか?  そう思って調べてみると、仕様は「1ファイルのみ入力可能」だった。 一時はがっかりしたが、しかし ps2pdf12.bat は Ghostscript を使うためのシェルにすぎないはずで、当の Ghostscript が複数の Postscript ファイルを扱えることは分かっている。 だったら何とかなるのでは?
 と思って ps2pdf12.bat を解析してみると、意外にこれがしょぼい。

  1. ps2pdf12.bat は「バージョン1.2の PDF を作る」という Ghostscript のオプション(コマンドライン引数)を一時ファイルに書き出して、ps2pdfxx.bat に処理を引き継ぐ
  2. ps2pdfxx.bat は環境変数をセットしたあと、PDF 生成のための Ghostscript のオプション(コマンドライン引数)を一時ファイルに追記して、 最後に Ghostscript 本体(gswin32c.exe)に処理を引き継ぐ
  3. 一時ファイルに書き出されたコマンドライン引数を読み込んで、Ghostscript 本体が PDF 文書を生成する

 こんな構造だから、2. の最後で Ghostscript を呼ぶときに複数の Postscript 文書を食わせてやれば目的は達成できるはずだ。また、ps2pdf12.bat はほとんど仕事らしい仕事をしていないので、 いくつかの前提条件を設ければバッチファイルは1つにできるはずだ。

実はかんたんだった

 試行錯誤のすえ、以下のようなバッチファイルを作ってみた。 といっても実行するコマンドは1つだけなので、 バッチファイルというほどのものでもない。 引数の数をチェックしたり用法を表示したりという付加機能はすべて削り、 出力先のファイル名は固定(merged.pdf)とした。機能向上は各自でやってほしい。

@echo off
gswin32c -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE#pdfwrite -sOutputFile=merged.pdf -dCompatibilityLevel#1.2 @C:¥gs¥gs7.07¥lib¥neveremb.txt -f %1 %2 %3 %4 %5 %6 %7 %8 %9


(c) SWA / KASAI TakayaSWA へメールを送る
最終更新: 2004年 3月 6日
簡易包装にご協力ください。