ソースコードのダウンロード

「PDFDesigner」はJavaScriptのPDF編集クラスライブラリです。機能はこのサイトのWebアプリケーションと同じで「PDFの結合、分割、抽出、削除、回転、しおり、文書プロパティ、表示設定」となります。

PDFファイルを解析するクラスなどがありますので、これ以外にも機能を追加可能です。

ダウンロード

ダウンロードする前に必ず 「オープンソースのライセンス」 をお読みください。

種類ファイル名ファイルサイズバージョン
通常版pdf-designer.js196kv1.00
圧縮版pdf-designer-min.js64kv1.00

通常版はコメント付きのソースコードです。圧縮版は通常版と機能は全く同じですが変数名の短縮やコメント/スペースが削除されています。

開発時は「通常版」でリリース時は「圧縮版」のご利用をお薦めします。

付属ファイル

付属する「pdf-designer-inc-jp.js」及び「pdf-designer-inc-en.js」のファイルは開発時用のエラーメッセージを日本語と英語で定義しているだけです。リリース時にはそれらのファイルは読み込まなくて良いです。その代わりに「try .. finally」または「try .. catch」で処理を包み込んでください。

使い方

pdf-designer.jsの使い方は 「pdf-designer.jsの使い方」 をご覧ください。

対応しているファイル

対応しているPDFファイルは「Microsoft Office、OpenOffice、Chrome」などで作成されたファイルです。形式で言いますとPDF1.4形式(ISO 19005-1など)に準拠しているファイルです。「PDFの純正ツール」で作成したPDF1.5形式以降のファイルは基本的に対応していません。但し、PDF1.5形式以降のファイルでも内部的にPDF1.4形式ならば読み込めます。

...

約13年前のコードでしたので各種変換のロジック(spaghetti)などは当時のままで移植しております。また、Javascriptでのはじめてのライブラリとなる為、Javascriptのルールに従ってない場合があるかも知れません。

ブラウザとの相性

Chrome > IE11 > FireFox

2016年1月現在のFireFoxはCPUの最適化がされていない為、少し遅いです。また、上記以外のブラウザは確認していません。

変換速度

実は私が2003年に作成したWindowsアプリケーションより高速なんです。

これはブラウザの「JavaScriptエンジンが良い」のとDelphi5(1999年製)でコンパイルしたEXEファイルが「最近のCPUに最適化されていない」からだと思います。

クラス名

クラス名の先頭には「T」が付いています。これはDelphiのルールです。

未移植

Delphiから移植できていないクラスは「TPDFFontDecoder」「TPDFStreamDecoder」「TPDFTextDecoder」です。順にフォント、ストリーム、テキスト関連で合計100kぐらいのコード量があったと思います。

これらはZlibのFlateDecodeが必要ですので未実装です。

既知の脆弱性?

当時はfor構文よりwhile構文のほうが高速でしたのでwhileで無限ループを多用しています。ですので「あまりにも規格外」のPDFファイルを読み込むと永久ループになる可能性があります。

但し、最近のブラウザは永久ループになった時点で自動的に停止してくれます。

Stream関連

Streamは移植時間を減らす為になるべくDelphiのTStreamクラスに合わせていますが、完全コピーではないので「ヤヤコシク」なっています。

各種変換クラス

各種変換クラスは3つのグループに分かれています。Aグループは「TPDFCombine、TPDFKnife、TPDFDeletePage」、Bグループは「TPDFRotatePage」、Cグループは「TPDFInfoMaker、TPDFOutLineMaker」となります。

なんらかの意図があったはずですが、今となっては覚えていません。

try .. finally,try .. catch

例外処理の部分は不明な所がありますが、今の私にもわかりませんのでそのまま移植しています。適宜、変更して下さいね。

最後に

基本的に無保証・無サポートです。バージョンアップは恐らくしないと思います。

最新のPDFに対応するにはAcrobatの購入が必要で、そこから英語の仕様書(1300ページ)を日本語に翻訳+バイナリエディタで様々なPDFを解析しないと出来ないです。また、PDF1.5形式以降はZlibのFlateDecodeが必要になります。

スポンサーリンク