pdf-designer.jsの使い方

[目次]

1. PDFを結合
2. PDFを分割
3. PDFを削除
4. PDFを回転
5. PDFにしおりを追加
6. PDFの文書情報と表示設定
7. 各クラスの概要
8. 各クラスの詳細
    TPDFAnalyst
    * TPDFParser
    * TPDFCode
    TPDFDocInfo
    TPDFDocView
    * TReadStream
    * TMemoryStream
    * TFileStream
    TPDFCombine
    TPDFKnife
    TPDFDeletePage
    TPDFRotatePage
    TPDFInfoMaker
    TPDFOutLineMaker
    TPDFPageLayout
    TPDFPageMode
    TPDFOpenActionType
    TPDFOpenAction
    TPDFViewerPreferences
    TPDFNode
    TPDFNodeList
    TPDFOutLineManager
    TColor
    TRect
9. 共通関数
10. コールバック関数

はじめに

pdf-designer.jsは ダウンロード してあなたの環境に設置して下さい。

1. PDFを結合

コードの行数が81行ありますが、重要なコードは22行目のTPDFAnalyst.LoadFromStream()と52行目のTPDFCombine.SaveToFile()のメソッドです。

TPDFAnalystはPDFを読み込み、TPDFCombineはPDFファイルを結合します。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="pdf-designer.js" type="text/javascript"></script>
<script type="text/javascript">
var Analysts = new Array();    

function onChangeFile(event,index) {
    var reader = new FileReader();
    var file = event.target.files;
    
    document.getElementById("errmsg").innerHTML = '';
    
    reader.onload = function (event) {
        var Stream = new Uint8Array(reader.result);
        
        Analysts[index] = new TPDFAnalyst();
        
        try {
          
            Analysts[index].LoadFromStream(Stream);
            
            if (Analysts[index].Encrypt) {
                document.getElementById("p"+(index+1)).innerHTML =
                   (index+1) + 'つ目のファイル - 未対応';
                document.getElementById("errmsg").innerHTML = 
                   '暗号化されているファイルには対応していません。';
            } else {
                document.getElementById("p"+(index+1)).innerHTML = 
                   (index+1) + 'つ目のファイル - [' + Analysts[index].PageCount +
                    'ページ / PDF' + Analysts[index].Version + ']';
            }
        } catch (e) {
            Analysts[index] = null;
            document.getElementById("p"+(index+1)).innerHTML =
                   (index+1) + 'つ目のファイル - 未対応';        
            document.getElementById("errmsg").innerHTML =
               (index+1) +'つ目のファイルは未対応です';
        }
    }
    reader.readAsArrayBuffer(file[0]);
}

function run() {        
    var PDFCombine = new TPDFCombine();

    if (Analysts[0] != null && Analysts[1] != null) {
        try {
          
            // PDF_GetDateTime_Now()の関数は現在日時を返します。
            PDFCombine.SaveToFile(PDF_GetDateTime_Now() + '.pdf', Analysts);
            
        } catch (e) {
            Analysts[0] = null;
            Analysts[1] = null;
            
            document.getElementById("errmsg").innerHTML = 
              'PDFファイルの結合に失敗しました。 ';
        }
    } else {
        document.getElementById("errmsg").innerHTML =
          'ファイルは2つ指定して下さい。';
    }
}
</script>
</head>
<body>
<h1>PDFファイルの結合</h1>
<hr>
<p>PDFファイルを2つ選択してください。</p>
<p id="errmsg" style="color:red;"></p>   
<p id="p1">1つ目のファイル</p>
<input type="file" id="inputfile1" accept="application/pdf" onchange="onChangeFile(event,0)"><br>
<p id="p2">2つ目のファイル</p>
<input type="file" id="inputfile2" accept="application/pdf" onchange="onChangeFile(event,1)"><br>
<br>
<br>
<br>
<button id="run" style="width:200px;height:30px;" onclick="run();">結合の開始</button>
</body>
</html>

FileReader()は非同期でファイルを読み込ます。同期で読み込む場合はWorkerオブジェクトを使用してFileReaderSync()で読み込んでください。共にHTML5の機能です。

使用クラス: TPDFAnalyst TPDFCombine

2. PDFを分割(抽出)

次のコードはPDFファイルの1ページ目を抽出します。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="pdf-designer.js" type="text/javascript"></script>
<script type="text/javascript">
var Analyst = null;    

function onChangeFile(event) {
    var reader = new FileReader();
    var file = event.target.files;
    
    document.getElementById("errmsg").innerHTML = '';
    
    reader.onload = function (event) {
        var Stream = new Uint8Array(reader.result);
        
        Analyst = new TPDFAnalyst();
        
        try {
          
            Analyst.LoadFromStream(Stream);
            
            if (Analyst.Encrypt) {
                document.getElementById("p1").innerHTML = 'PDFファイル - 未対応';
                document.getElementById("errmsg").innerHTML = 
                   '暗号化されているファイルには対応していません。';
            } else {
                document.getElementById("p1").innerHTML = 
                    'PDFファイル - [' + Analyst.PageCount +
                    'ページ / PDF' + Analyst.Version + ']';
            }
        } catch (e) {
            Analyst = null;
            document.getElementById("p1").innerHTML = 'PDFファイル - 未対応';      
            document.getElementById("errmsg").innerHTML = 'このファイルは未対応です。';
        }
    }
    reader.readAsArrayBuffer(file[0]);
}

function run() {        
    var PDFKnife = new TPDFKnife();

    if (Analyst != null) {
        try {
           
            PDFKnife.SaveToFile(PDF_GetDateTime_Now() + '.pdf', Analyst,1,1);
            
        } catch (e) {
            Analyst[0] = null;
            Analyst[1] = null;
            
            document.getElementById("errmsg").innerHTML = 
              'PDFファイルの抽出に失敗しました。 ';
        }
    } else {
        document.getElementById("errmsg").innerHTML =
          'ファイルを選択して下さい。';
    }
}
</script>
</head>
<body>
<h1>PDFファイルの分割(抽出)</h1>
<hr>
<p>1ページ目を抽出します。</p>
<p id="errmsg" style="color:red;"></p>   
<p id="p1"></p>
<input type="file" id="inputfile1" accept="application/pdf" onchange="onChangeFile(event)"><br>
<br>
<br>
<br>
<button id="run" style="width:200px;height:30px;" onclick="run();">開始</button>
</body>
</html>

使用クラス: TPDFAnalyst TPDFKnife

3. PDFを削除

1ページ目を削除します。2ページ以上あるPDFファイルを選択して下さい。

var PDFDeletePage = new TPDFDeletePage();
PDFDeletePage.SaveToFile(PDF_GetDateTime_Now() + '.pdf', Analyst,1,1);

使用クラス: TPDFAnalyst TPDFDeletePage

4. PDFを回転

全てのページを右90度回転します。

var PDFRotatePage = new TPDFRotatePage();
PDFRotatePage.SaveToFile(PDF_GetDateTime_Now() + '.pdf', Analyst,1,1,Analyst.PageCount);

使用クラス: TPDFAnalyst TPDFRotatePage

5. PDFにしおりを追加

全てのページにレベル1のしおりを追加します。

var PDFOutLineMaker = new TPDFOutLineMaker();

// 表示設定(しおり)
PDFOutLineMaker.View.PageMode = TPDFPageMode.pmUseOutlines;

// ルートノードの追加(親ノード)
for (var i = 0; i < Analyst.PageCount; i++) {
   PDFOutLineMaker.OutLine.AddRoot((i+1) +' page', (1+i), 0, '', false, false, null);
}
                                                                                    
PDFOutLineMaker.SaveToFile(PDF_GetDateTime_Now() + '.pdf', Analyst);

使用クラス: TPDFAnalyst TPDFOutLineMaker

6. PDFの文書情報と表示設定

全ての文書情報を変更して表示設定をサムネイルにします。

var PDFInfoMaker = new TPDFInfoMaker();

// 文書情報
PDFInfoMaker.Info.Title = 'タイトル';
PDFInfoMaker.Info.Subject = 'サブタイトル';
PDFInfoMaker.Info.Author = '作成者';
PDFInfoMaker.Info.Keywords = 'キーワード';
PDFInfoMaker.Info.Creator = 'アプリケーション';
PDFInfoMaker.Info.Producer = 'PDF変換';
PDFInfoMaker.Info.CreationDate = PDF_GetDateTime_Now();
PDFInfoMaker.Info.ModDate      = PDF_GetDateTime_Now();

// 表示設定(サムネイル)
PDFInfoMaker.View.PageMode = TPDFPageMode.pmUseThumbs;
                                                                                    
PDFInfoMaker.SaveToFile(PDF_GetDateTime_Now() + '.pdf', Analyst);

使用クラス: TPDFAnalyst TPDFInfoMaker

7. 各クラスの概要

主要なクラスは TPDFAnalyst各種変換のクラス となります。クラスは全部で22個、Enumは3個です。JavaScriptですのでC++などのクラス/Enumと異なります。

[基本]

クラス用途
TPDFAnalystPDFファイルを「解析」するクラス。PDFファイルは必ずこのクラスで読み込む必要があります。
* TPDFParserPDFファイルの各種変換処理をする為に「構文解析、書き込み」をするクラス
* TPDFCodePDFファイルの「文字コード」を扱うクラス
TPDFDocInfoPDFファイルの「文書プロパティ」を扱うクラス
TPDFDocViewPDFファイルの「表示設定」を扱うクラス

[ストリーム]

クラス用途
* TReadStream読み込み専用のストリームクラス
* TMemoryStream読み書き可能なストリームクラス
* TFileStream書き込み専用のストリームクラス

[各種変換]

クラス用途
TPDFCombinePDFファイルを「結合」するクラス
TPDFKnifePDFファイルのページを「分割(抽出)」するクラス
TPDFDeletePagePDFファイルのページを「削除」するクラス
TPDFRotatePagePDFファイルのページを「回転」するクラス
TPDFInfoMakerPDFファイルの「文書プロパティ」と「表示設定」を編集するクラス
TPDFOutLineMakerPDFファイルに「しおり」を追加するクラス

[表示設定]

クラス用途
TPDFPageLayoutページレイアウトに関するEnum型
TPDFPageModeページモードに関するEnum型
TPDFOpenActionType表示倍率に関するEnum型
TPDFOpenAction表示倍率に関するクラス
TPDFViewerPreferencesウインドウオプション、ユーザーインターフェイスオプションに関するクラス

[しおり]

クラス用途
TPDFNodeしおり用の「ノード」のクラス
TPDFNodeListしおり用の「ノードリスト」のクラス
TPDFOutLineManagerしおり用の「ノード」を元にしおりを書き込むクラス

[その他]

クラス用途
TColorRGB値を格納するクラス
TRectページサイズ(MediaBox)を格納するクラス

8. 各クラスの詳細

各クラス、Enum型の詳細です。デフォルトは緑色にしています。

[TPDFAnalyst]

プロパティ用途
VersionPDFバージョン(String)
Streamストリーム(TReadStream)
ObjectCountオブジェクト数(Int)
ObjectPosArrayオブジェクトの位置への配列(Array型)
DeleteObject削除済みオブジェクト(Array型)
XrefTableListXrefテーブルリスト(Array型)
Encrypt暗号化(true/false)
OptimizeWeb用に最適化(true/false)
Tagタグ付きPDF(true/false)
PageCountページ数(Int)
PageSizeページサイズ(TRect)
RootIDRoot ID(Int)
InfoIDInfo ID(Int)
MetadataIDMetadata ID(Int)
FirstPageIDFirstPage ID(Int)
FirstPagesIDFirstPages ID(Int)
OutlinesIDOutlines ID(Int)

メソッドLoadFromStream(Uint8Array)
用途PDFファイルを読み込む
引数Uint8Array: 8ビットの符号なし整数値の配列(JavaScriptのオブジェクトです。ファイルのバイナリ配列を渡します)
戻り値なし

[TPDFParser]

内部的に使用するだけです。

[TPDFCode]

内部的に使用するだけです。

[TPDFDocInfo]

プロパティ用途
Titleタイトル(String)
Subjectサブタイトル(String)
Author作成者(String)
Keywordsキーワード(String)
Creatorアプリケーション(String)
ProducerPDF変換(String)
CreationDate作成日(String)
ModDate更新日(String)
Trappedトラップ(true/false)

メソッドGetPDFDocInfo(TPDFAnalyst)
用途PDFファイルから文書プロパティを取得してプロパティに設定する
戻り値なし

文書情報のみを変更する際はModDate(更新日)を更新してください。更新しないと「Acrobat Reader」では正常に表示されない場合があります。恐らくキャッシュを読み込んでるのだと思います。

[TPDFDocView]

プロパティ用途
PageModeTPDFPageMode(Enum)
PageLayoutTPDFPageLayout(Enum)
OpenActionTPDFOpenAction
ViewerPreferencesTPDFViewerPreferences

メソッドGetPDFDocView(TPDFAnalyst)
用途PDFファイルから表示設定を取得してプロパティに設定する
戻り値なし

[TReadStream]

内部的に使用するだけです。

[TFileStream]

内部的に使用するだけです。

[TMemoryStream]

内部的に使用するだけです。

[TPDFCombine]

プロパティ用途
InfoTPDFDocInfo
ViewTPDFDocView

メソッドSaveToFile(FileName,TPDFAnalyst of Array,CallBack)
用途PDFファイルを結合する
引数FileName: ダウンロードするファイル名
TPDFAnalyst of Array: TPDFAnalystの配列
CallBack: コールバック関数(省略可能)
戻り値なし

[TPDFKnife]

プロパティ用途
InfoTPDFDocInfo
ViewTPDFDocView

メソッドSaveToFile(FileName,TPDFAnalyst,begin,end)
用途PDFファイルを分割(抽出)する
引数begin,end: 抽出するページ番号を設定する(1,2,3...N)
戻り値なし

[TPDFDeletePage]

プロパティ用途
InfoTPDFDocInfo
ViewTPDFDocView

メソッドSaveToFile(FileName,TPDFAnalyst,begin,end)
用途PDFファイルを削除する
引数begin,end: 削除するページ番号を設定する(1,2,3...N)
戻り値なし

[TPDFRotatePage]

メソッドSaveToFile(FileName,TPDFAnalyst,Rotate,begin,end)
用途PDFファイルを回転する
引数Rotate: 1-3を指定(1: 右90度 2: 左90度 3: 180度)
begin,end: 回転するページ番号を設定する(1,2,3...N)
戻り値なし

[TPDFInfoMaker]

プロパティ用途
InfoTPDFDocInfo
ViewTPDFDocView

メソッドSaveToFile(FileName,TPDFAnalyst)
用途PDFファイルの文書プロパティ、表示設定をする
戻り値なし

[TPDFOutLineMaker]

プロパティ用途
InfoTPDFDocInfo
ViewTPDFDocView
OutLineTPDFOutLineManager

メソッドSaveToFile(FileName,TPDFAnalyst)
用途OutLineプロパティを元にPDFファイルに「しおり」を追加する
戻り値なし

[TPDFPageLayout]

Enum用途
plDefaultデフォルト
plSinglePage単一のページ
plOneColumn連続
plTwoColumnLeft見開き(左)
plTwoColumnRight見開き(右)

[TPDFPageMode]

Enum用途
pmDefaultデフォルト
pmUseNoneなし
pmUseOutlinesしおりとページ
pmUseThumbsサムネイルとページ
pmFullScreenフルスクリーン

[TPDFOpenActionType]

Enum用途
oaDefaultデフォルト
oaXYZ表示倍率。
この項目を選択する場合はTPDFOpenAction.Zoomの値を設定する必要がある
oaFit全体表示
oaFitH幅に合わせる
oaFitV(未使用)
oaFitR(未使用)
oaFitB(未使用)
oaFitBH描画領域の幅に合わせる
oaFitBV(未使用)

[TPDFOpenAction]

プロパティ用途
Left(未使用)
Top(未使用)
Right(未使用)
Bottom(未使用)
Zoom表示倍率の指定。0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 4, 8, 16のいずれかを指定する。指定しない場合はデフォルトの-1
ObjectID最初に表示するページのオブジェクト番号(指定しない場合はデフォルトの-1で1ページ目が表示される)
GenerationID最初に表示するページの世代番号。ObjectIDプロパティと共に指定します。(指定しない場合はデフォルトの-1で1ページ目が表示される)

ページのオブジェクト番号、世代番号の意味がわからない場合は常に-1のままにして下さい。Hint?
SubTypeTPDFOpenActionType(Enum)

[TPDFViewerPreferences]

プロパティ用途
HideToolbarツールバーを非表示(true/false)
HideMenubarメニューバーを非表示(true/false)
HideWindowUIウインドウコントロールを非表示(true/false)
FitWindow幅に合わせる(true/false)
CenterWindowウインドウをセンタリングする(true/false)
Direction綴じ方(右)(true/false)
DisplayDocTitle文書のタイトルを表示する(true/false)
NonFullScreenPageModeTPDFDocView.PageModeがpmFullScreen(フルスクリーン)の時でPDFのフルスクリーンが解除された後のTPDFPageModeを指定します。指定しない場合はデフォルトのpmDefault

[TPDFNode]

プロパティ用途
Page表示するページ番号(1,2,3 ... N) (Int)
ShowPos表示するページの座標位置(基本は0を推奨) (Int)
Captionしおりのタイトル(String)
URLURL(Pageプロパティが -1 の時に有効でしおりをクリックするとURLへ飛びます) (String)
Level階層レベル。親ノードはレベル0で子・孫ノードは最大レベル4まで可能 (Int)
Italic斜体(true/false)
Bold太字(true/false)
Colorタイトルの色(TColor) 必要ない場合はnullを指定
Parent親ノード(TPDFNode)
ChildNodes子ノード(TPDFNodeList)

メソッドGet(Index)
用途子ノードを取得する
戻り値TPDFNode

メソッドAddChild(Caption, Page, ShowPos, URL, Bold, Italic, Color)
用途子ノードを追加する
引数TPDFNodeのプロパティを参照
戻り値TPDFNode

メソッドGetCount()
用途子ノードの数を取得する
戻り値子ノードの数

メソッドGetChildCount()
用途子ノードと孫ノードの合計数を取得する
戻り値子ノードと孫ノードの合計数

[TPDFNodeList]

メソッドGet(Index)
用途ノードを取得する
戻り値TPDFNode

メソッドAdd(Parent, Level, Caption, Page, ShowPos, URL, Bold, Italic, Color)
用途ノードを追加する
引数TPDFNodeのプロパティを参照
戻り値TPDFNode

メソッドGetCount()
用途ノードの数を取得する
戻り値ノードの数

[TPDFOutLineManager]

プロパティ用途
Node親ノードのリスト(TPDFNodeList)

メソッドGet(Index)
用途親ノードを取得する
戻り値TPDFNode

メソッドAddRoot(Caption, Page, ShowPos, URL, Bold, Italic, Color)
用途親ノードを追加する
引数TPDFNodeのプロパティを参照
戻り値TPDFNode

メソッドGetCount()
用途親ノードの数を取得する
戻り値親ノードの数

メソッドGetNodeCount()
用途全て(親・子・孫含む)のノードの合計数を取得する
戻り値全て(親・子・孫含む)の合計数

[TColor]

プロパティ用途
RedRed。0-255の数値
GreenGreen。0-255の数値
BlueBlue。0-255の数値

このクラスを生成するには共通関数の PDF_RGB() を使用します。

[TRect]

プロパティ用途
LeftLeft
TopTop
RightRight
BottomBottom

9. 共通関数

関数PDF_GetDateTime_Now()
用途現在時刻を取得する(yyyymmddhhmmss形式)
戻り値現在時刻

関数PDF_RGB(Red, Green, Blue)
用途RGB値からTColorを返す
引数Red, Green, Blueの値は0-255の数値
戻り値TColor

10. コールバック関数

関数function PDFCallBack(value, filepos, files){}
用途PDFファイルの結合時のコールバック関数。コールバック関数とは変換処理中にこの関数が実行されますのでプログレスバーなどを制御する場合に使用します。
引数value: 現在の進行状況(最大100)
filepos: 現在のファイル番号(1,2,3...N)
files: 全ファイル数
戻り値なし

隠し機能

ここで紹介していない関数やクラスの隠しメソッドがあるかも知れません :-)

スポンサーリンク