PDFファイルの作成に関するエッセイ。 PDF作成に関するエッセイPDFデルフィを読む

この記事では、独自の作成方法を見ていきます pdf-ドキュメント、および次の記事では、どのように表示できるかを検討します pdf-プロジェクト内のドキュメント、印刷コンテンツ、ドキュメント内の移動など。

このためには、タブのコンポーネントが必要です レイブ..。 作業に必要なコンポーネントをインストールしましょう。これらは次のとおりです。

  • TRvNDRWriter
  • TRvRenderPdf
  • TButton

成分 TRvNDRWriterでの録音を目的としています pdf-ストリームを介したファイル情報(テキスト、グラフィック)。

成分 TRvRenderPdf情報(テキスト、グラフィックなど)の作成、レンダリングを目的としています。 さて、ボタンを押すことで、何かを入力します pdf-ファイル。

理論から多くを書くことはしませんが、すぐにプログラミングに移りますが、最初に通常の空を作成する必要があります pdf-ファイルを作成し、プログラムのルートに配置します。 イベントに加えて OnClickボタンに次のコードを記述します。

手順TForm1。 Button1Click(送信者:TObject); var Streams:TMemoryStream; Streamsを開始します:= TMemoryStream。 作成; RvNDrWriter1。 ストリーム:=ストリーム; RvNDRWriter1。 実行する; RvRenderPdf1。 PrintRender(Streams、 "test.pdf"); ShellExecute(Handle、nil、 "test.pdf"、 ""、 ""、SW_SHOW); FreeAndNil(ストリーム); 終わり;

すべての情報を描画するストリームを作成し、レンダリングを開始し、データが描画されるファイルを指定し、最後にストリームを破棄します。

ここで、データを描画するときに発生するイベントが必要です。このイベントでは、すべての情報が表示されます。 コンポーネントの選択 TRvNDRWriterこのコンポーネントのイベントのリストを確認すると、イベントが見つかります OnPrintこの場合、次のコードを記述します。

手順TForm1。 印刷(送信者:TObject); bmpを開始します:= TBitmap。 作成; bmp。 LoadFromFile( "test.bmp"); RvNDRWriter1を使用して、SetFont( "Arial"、16)を開始します。 FontColor:= clGreen; 印刷( "テストテキスト"); PrintHeader( "PDFファイルの開始"、pjCenter); PrintFooter( "PDFファイルの終了"、pjCenter); LineTo(10、10); PrintBitmap(1、1、1、1、bmp); 終わり; FreeAndNil(bmp); 終わり;

まず、写真をアップロードします * .bmp自然に変化する bmp、クラスオブジェクトがあります TBitmap..。 ロードしてから描画します pdf-資料。

そして、私はすべてが明確だと思います、手順 PrintHeader-ドキュメントのタイトル(ページ)に碑文を表示します、手順 PrintFooter-ドキュメント(ページ)の最後に碑文を表示します。 手順 PrintBitmap-ドキュメント内の画像を表示します、手順 SetFont-ドキュメントのフォント、手順を設定します FontColor-ドキュメントのフォントの色を設定します。

プログラムでPDFドキュメントの表示を整理するには、主に2つの方法があります。

  • ActiveXテクノロジを使用します。
  • 特別なコンポーネントの使用。

PDFを操作するためのコンポーネントは、すべてのDelphiエディションで使用できるわけではなく、ほとんどの場合、それらを検索して追加でインストールする必要があります。 同時に、ActiveXを使用するには、適切なものがあれば十分です。 ソフトウェア..。 V この場合 Adobe Acrobat Reader(無料)またはAdobeAcrobat。

ActiveXの操作は、大きく2つの段階に分けることができます。

  • タイプまたはコンポーネントのライブラリのインポート。
  • 実際には、アプリケーションでのインポートされた資金の使用。
コンポーネントのインポートActiveX

コンポーネントをインポートするには、Delphiのメインメニューで[コンポーネント]-[コンポーネントのインポート]コマンドを使用します。 インポートプロセス自体はウィザードとして実装されます。

ウィザードの最初のページで、[ActiveXコントロールのインポート]を選択します。

その後、インポートしたコンポーネントをどうするかを決める必要があります。 Delphiコンポーネントの形で使用する予定なので、「新しいパッケージにインストール」を選択します。

あとは、新しく作成したパッケージの名前を指定するだけです。

[完了]ボタンをクリックすると、PDF表示のActiveXコンポーネントがDelphiにインポートされます。

意見アプリ内のPDF

ActiveXを使用するアプリケーションで表示PDFファイルを作成するには、TAcroPDFコンポーネントが必要です。 インポートプロセスについては、上記で詳しく説明しています。

例として、次のアプリケーションを作成してみましょう。 以下のスクリーンショットに示すように、フォームにTAcroPDF、TOpenDialog、およびTButtonコンポーネントを配置します。

ボタンをクリックすると、ファイルを開くダイアログが呼び出され、表示するPDFファイルが選択されます。


発行日2005年9月23日07:00PDFファイルの作成に関するエッセイ

V 近々多くのPDFコンバーター、リーダー、書き込みがインターネット上で見つかりました。それらの大部分はお金で提供されています。プログラム自体は10ドルから300ドルです。さらに多くのお金のソースコード、価格200ドルから始まり、1か所で(これに興味を持って、私はインターネットに登りました)、900ユーロもかかりました。

私はプログラミングの観点からこの問題に興味を持っていました、そして私はあなたの注意を引く結果をもたらします。 (これらの結果は私が内部を研究している間に得られたものです PDFファイルしかし、あなたがそれを開くとき トータルコマンダー F3経由)

通常のPDFファイルには4つの部分があります :=

とは

? これは、PDF仕様バージョンの一般的な言及です。 これはPDFファイルの最初の行にあります。 たとえば、「%PDF-1.3」今年の初夏にリリースされたアクロバットの第7バージョンでは、この数値は「%PDF-1.7」ですが、これは製品のバージョンではありません。仕様のバージョンです。 PDFの2行目は、小さなabrokadabra(明らかに今後の使用を目的としています) "%vgpu"です。

誰もがPDFの最初の部分を整理しました。

呼ばれる2番目の部分は何ですか ?

答えは非常に単純です。それは一連のオブジェクトであり、その説明はヘッダーと同様にテキスト形式で表示されます。

各オブジェクトは、名前にシリアル番号が含まれるテキストフラグメントです。たとえば、 "4 0 obj"

  • 4 これはオブジェクトのシリアル番号です
  • 0 これは、ファイルの(再)世代番号です。つまり、ファイルが更新(編集)されたときの番号です。 与えられた数増加します
  • objこれは、ドキュメントの本文でオブジェクトに遭遇したことを意味するコードワードです。

すべてのオブジェクトは、間接と直接に分けられます。 すべての間接的、そしてそれらのほとんどは、単語の後に obj体に区切り文字があります」<<", означающее начало данных объекта. И в конце данных закрывающий делиметер ">> "とコードワード endobj

直接のオブジェクトは、その本体に開閉デリメータを持たないようにする必要があります。 "<<", ">>「すべての間接オブジェクトには、 相互参照表..。 ファイルの先頭からオブジェクトの先頭までのオフセットの形式でリンクを表示します(オブジェクト内のデータ(行)は分離されています) #13#10 また #13 )

PDFファイルの本文にある「最も重要な」オブジェクトのタイプには、誇らしげな名前が付いています 「/カタログ」

4 0 obj<< /Type /Catalog /Pages 2 0 R /OpenAction [ 5 0 R /XYZ null 364 1 ] /PageMode /UseNone >> endobj

実際、「Helloworld」タイプの最小PDFファイルの本文には3つの「メイン」オブジェクトが含まれている必要があります。 それらをタイプ別にリストします。

  • 「/カタログ」ページツリーへのリンクが含まれています( /ページ)
  • 「/ページ」ドキュメントページのグループへのリンクが含まれています(たとえば、2 0 obj> endobj)
  • 「/ページ」特定のページに関連するオブジェクトへのリンクが含まれています。 (たとえば、3 0 obj> / Rotate 0 >>)
そして、いくつかの「マイナー」

ページオブジェクトを解析してみましょう。

  • /回転プログラムに表示されたときにページ画像を何度回転させる必要があるかを示すフィールド
  • / MediaBox/ CropBoxページサイズを説明するフィールド
  • / 親親参照 「/ページ」
  • / 資力このフィールドは、ページを表示するときに使用するフォントを示し(フォントは別のオブジェクトです)、この設定を設定するProcSetは、このページのデータストリームのコンテンツを示します(フィールドではなくオブジェクトとして定義することもできます)。
  • / コンテンツ「page」オブジェクトの最も興味深いフィールドは、このページのコンテンツオブジェクトへのリンクを提供します。さらに、このフィールドが「page」オブジェクトにない場合、ページは空です。
ページの内容:
オブジェクト "ストリーム" 4 0obj>ストリームBT / F12 9 Tf 10 782 TD 0 -12.5 TD(最大フォーキン)Tj 0 -12.5 TD(mnb)Tj 0 -12.5 TD()Tj 0 -12.5 TD(最大プリベット)Tj 0 -12.5 TD (1)Tj 0 -12.5 TD(1)Tj 0 -12.5 TD(2)Tj 0 -12.5 TD(3)Tj 0 -12.5 TD(45)TjETエンドストリームendobj /長さ305このフィールドは、語 ストリーム言葉に エンドストリーム

最も単純なオプションは、オブジェクト内のエンコードおよび圧縮されていないデータストリームです。 ストリーム..。 オペレーター限定です BTET

BTはテキストオブジェクトを開始します-テキストの開始を特徴付けますETはテキストオブジェクトを終了します。 -テキストの終わりを特徴付ける/ F12 9 Tf

  • / F12これは、このページで使用されているフォントを特徴付けるオブジェクトのコードネームです。
  • 9 これはフォントサイズです
  • Tfこれは、Steamオブジェクト内の特定の文字列がフォントとサイズの設定であることを特徴付ける演算子です
10 782 TDこれらは、指定された行が開始する場所からの数値です(カウントは左上隅から行われます)Tjは改行演算子です。括弧内はテキストです。

ここではコードストリームについては説明しません。 これは、RC4、RC5、MD5アルゴリズムに基づいています。

オブジェクトとは フォント 12 0 obj>

  • /タイプ/フォント当然、タイプの名前
  • /サブタイプ/タイプ1サブタイプ名
  • /名前/ F7 F7これはコードネームです

PDFはいくつかのタイプのフォントをサポートしています。 それらは以下にリストされています

  • タイプ1、サブセットおよび複数のマスター「スナップショット」を含む
  • タイプ3
  • サブセットを含むTrueType
  • タイプ0
正直なところ、タイプ3、サブセットを含むTrueType、タイプ0を理解していなかったので、それらについては何も言えません。
タイプ1は次のフォントです。CourierCourier-BoldCourier-BoldOblique Courier-Oblique Helvetica Helvetica-Bold Helvetica-Bold Oblique Helvetica-Oblique Times-Roman Times-Bold Times-Italic Times-BoldItalic Symbol ZapfDingbats

20 0 obj> endobjこれは、最初のタイプのフォントのコードネーム名を持つオブジェクトです。 このコードネームで、オブジェクト自体を簡単に取得できます フォント..。 6 0 obj>

ALL:つまり、最小 次のオブジェクトで構成されます。 「カタログ」、「ページ」、「ページ」、「リソース」(オプションで、ページオブジェクトのフィールドとして存在できます)、型指定されていないオブジェクト "ストリーム"、オブジェクトのグループ "フォント"

何が起こったか ? 実際、これは通常のテキストテーブルであり、単語で始まります 外部参照その本体には、ドキュメント内のすべての間接オブジェクトへの参照があります。 次に例を示します。xref0270000000021 65535 f 0000000016 00000 n 0000000105 00000 n 0000000169 00000 n 0000000356 00000 n 0000000713 00000 n 0000000892 00000 n 0000001006 00000 n 0000001125 00000 n 0000001247 00000 n 0000001373 00000 n 0000001486 00000 n 000000 n1604 00000 n 000000 n1604 0018 0000001967 00000 n 0000002084 00000 n 0000002203 00000 n 0000002326 00000 n 0000002439 00000 n 0000002558 00000 n 0000000024 00001 f 0000002751 00000 n 0000002831 00000 n 0000000000 00001 f 0000002915 00000 n 0000002955 00000 n 0 27 これらの番号は次のことを示しています。

  • 0-テーブルの最初のオブジェクト番号
  • 27-テーブル内の要素の数

テーブルの最初の要素は常に「」の形式になります。 XXXXXXXXXX 65535 f"ここで、Xは数値であり、65535はテーブルの最初の項目のデフォルトです。" f "記号は"を表します " 自由"、つまり、オブジェクトは使用されません

このテーブルの要素を分析してみましょう。

  • 最初の10桁は、ファイルの先頭からオブジェクトの先頭までのオフセットです。
  • 0000000016は、ファイルの先頭から16バイト後に、オブジェクトの最初の言及によって迎えられることを意味します。つまり、たとえば、 4 0 obj

次の5桁は、ファイルの生成番号です。 ファイルが作成されたばかりの場合、それらは常にゼロです。 ファイルが変更されると、この数は1つ増えます。 あれは、 0000000024 00001 f

作成した正規PDFにはテーブルが1つだけあります。 ただし、ファイルが編集されている場合は、そのようなテーブルが多数存在する可能性があります。

テーブルの関係は、最後の要素を使用して実行されます とコードワード startxref

正規の新しく作成されたPDFファイルにはテーブルが1つだけあり、テーブルの後に要素があります トレーラーそしてトレーラーの後にコードワードが来る startxrefファイルの先頭からテーブルの先頭までのオフセットを示します。例を次に示します。 trailer> startxref 173 %% EOFこれは、ドキュメントの先頭から173バイト後に、コードワードが存在することを意味します。 外部参照..。 ただし、ファイルが編集されている場合、ファイルの最後のトレーラーは次のようになります。xref0 3 0000000000 65535 f 0000003609 00000 n 0000003832 00000 n trailer] >> startxref 173 %% EOFしかし、テーブルを見るとリンクポイント startxref 173、次に次のテーブルがあり、その後にトレーラーがあり、フィールドがあります /前の3896 3 16 0000000016 00000 n 0000000664 00000 n 0000000936 00000 n 0000001106 00000 n 0000001133 00000 n 0000001250 00000 n 0000001395 00000 n 0000001811 00000 n 0000001992 00000 n 0000002180 00000 n 0000002360 00000 n 0000002760 00000 n 0000003438 006 00000 n0000000トレーラー] %EOF

このフィールド /前の3896前の表とリンクを示しています startxref 567次のフィールドにいる間、ほぼ無期限に次のテーブルなどを指します startxref見えない 0 ..。 これは、すべてのテーブルを読んだことを意味します。

もちろん、このエッセイにはソースコードがありません。 ここにあります:2つの主要なモジュールがあります " PDFDocument「および補助」 PDFBaseFonts"

ファイルは資料に添付されています:

資料の議論[07/31/2006 06:33] 7件の投稿

開発者によって宣言されたコンポーネントの機能:

  • PDFドキュメントでのベクターおよびビットマップグラフィックスのサポート
  • PDFドキュメントをパスワードで保護
  • AcroForms / PDFフォームのサポート
  • ウォーターマーク
  • 世代 PDFドキュメント内部および外部リンク、Webリンク、ブックマーク付き
  • Unicodeの完全サポート
  • 複数のフォントのサポート、テキストの書式設定、複数列のテキストレイアウト
  • TCanvasのサポート
  • テキストを圧縮するための組み込みのアーカイバと グラフィック情報ドキュメント内
  • TIFFをPDFに変換する

例として、コンポーネントに付属するデモアプリケーションを作成することにしました THotPDF..。 このアプリは非常にシンプルです。2つのリンクとプレーンテキストを含むPDFを生成します。 コードも単純でわかりやすいです。

手順TForm1。 HelloWorldButtonClick(送信者:TObject); HPDFを開始します。 BeginDoc; HPDF。 現在のページ。 PrintHyperlink(20、35、 "Webサイト:" +MainEdit。Text、MainEdit。Text); HPDF。 現在のページ。 SetFont( "Times New Roman" 、、 16); HPDF。 現在のページ。 SetRGBHyperlinkColor(clRed); HPDF。 現在のページ。 PrintHyperlink(20、50、 "注文ページ:" +BuyEdit。Text、BuyEdit。Text); HPDF。 現在のページ。 SetFont( "Times New Roman" 、、 14); HPDF。 現在のページ。 TextOut(20、75、0、 "リンクをクリックしてナビゲートする"); HPDF。 EndDoc; 終わり;

コンポーネントの複雑さに立ち入ることなく、このデモの例で何が起こっているのか、そしてどのように起こっているのかを理解することができます。 始めて、見て 外観生成されたドキュメント:

ドキュメント内のこれらの2つの青い長方形は、2ページへのリンクです...そして「リンクをクリックしてナビゲートする」というプレーンテキストはどこにも表示されません。 クレジットを与える必要がありますが、長方形をクリックすると、リンクが開きます。 一般的に、開発者は急いでDelphiのサポートをXE3まで宣言するか、試用版は非常に興味深いものですが、このデモを開始した後、私はどういうわけか無料でもTHotPDFを使用したいという欲求を失いました。 次へ移りましょう。

4. PDFCreatorパイロット

価格: ソースなしの450 $からソース付きの9950 $(!!!)
5-XE4
http://www.colorpilot.com/pdflibrary.html#download

Delphi XE3 Professionalとほぼ同じくらいの費用がかかるライブラリ...さて、このライブラリが何であるかを見てみましょう。

開発者によって発表された機能:

  • PDFを簡単に作成するためのメソッドとプロパティの拡張セット。
  • 既存のPDFドキュメントを読んでマージする。
  • PDFドキュメントのページの追加と削除。
  • Unicodeサポート;
  • 各ページの透かしの作成。
  • PDFドキュメントのサムネイルを追加します。
  • フォント(TrueType、OpenType、Type1など)の使用と埋め込み。
  • JavaScriptとハイパーリンクを使用してインタラクティブなPDFドキュメントを作成します。
  • インタラクティブ要素のサポートAcroForm:テキスト入力フィールド、ボタン、ラジオボタン、ドロップダウンリスト、チェックボックス。
  • 生成されたPDFドキュメントの暗号化とパスワード保護。
  • ドキュメントコンテンツの作成と管理。
  • WinAPI関数を使用してPDFページに描画するためのHDCへのアクセス。
  • さまざまな形式(JPEG、TIFF、PNG、BMP、GIF)の画像の使用。
  • 注釈の作成と使用。
  • ディスクまたはメモリにPDFドキュメントを作成します。
  • PDFドキュメントからテキストを抽出します。

全体として、非常に印象的な機能のリストです。 これらの機能のいくつかが実際にどのように機能するかを見てみましょう。 デモ版をダウンロードしてインストールします。

インストール後、Delphi(私の場合はDelphi XE3)を起動し、メニューに移動します。

コンポーネント-インポートコンポーネント-インポートタイプライブラリ

リストから図書館を探しています

インポート、作成 新しいプロジェクトユニットを使用に含める PDFCreatorPilotLib_TLB。

これで、実際の例を使用してライブラリをテストできます。 まず、プレーンテキストドキュメントを生成してみましょう。

手順TForm1。 Button1Click(送信者:TObject); var fnt:整数; begin(初期化)PDF:= TPDFDocument4。 作成(nil); PDF。 SetLicenseData( "demo"、 "demo"); fnt:= pdf。 AddFont( "Verdana"、false、false、false、false、fcANSI); PDF。 UseFont(fnt、14); PDF。 ShowTextAt(20、40、 "HELLO、PDF!"); (保存)PDF。 SaveToFile( "HelloPDF.pdf"、true); PDF。 破壊; 終わり;

アプリケーションを起動し、作成されたPDFドキュメントを確認します。

それでは、ロシア語のテキストをファイルに書き込んでみましょう。

手順TForm1。 Button1Click(送信者:TObject); begin(初期化)(...)PDF。 ShowTextAt(20、40、 "Hello PDF!"); (保存)(...)終了;


たぶん、クラスプロパティのどこかで何かを構成する必要があり、Unicodeサポートを有効にするメソッドを呼び出しますが、そのようなお金で、設定やねじれに問題なくすぐに機能するライブラリを入手したいと思います。ちなみに、リンクを挿入する方法(AddHyperLink)も機能しませんでした。リンクが挿入されたとされているにもかかわらず、ドキュメントは元の状態のままでした。 しかし、私たちは敬意を表する必要があります。これは、以前に作成したPDF-kuを新しいドキュメントに挿入する試みです。

5. PDFtoolkit VCL v4.0.1.293

価格: ソースなしの349ドルからソース付きの499ドルまで
サポートされているDelphiバージョン: 6-XE4
試用版のダウンロードページ:http://www.gnostice.com/PDFtoolkit_VCL.asp?show = downloads

Web上のGnosticeから、このコンポーネントライブラリについてかなりの数の肯定的なレビューがあります。

機会によって PDFtoolkitほぼ1分の1が対応 PDF Creator Pilot、それらの。 PDFを「接着」したり、テキストを認識したり、リンクを挿入したり、ドキュメントを検索したりできます。 ただし、PDF Creator Pilotとは異なり、 gtPDFDocument1の場合はPDFtoolkit。 IsLoadedを実行してから、gtPDFDocument1を開始します。 TextOut( "おい、 平和!" 、IntToStr(gtPDFDocument1。PageCount)、 //テキストが挿入されるページの範囲 gtPDFDocument1。 GetPageSize(gtPDFDocument1。PageCount、muPixels)。 幅/ 2、 //ページの中央にテキストを挿入します gtPDFDocument1。 GetPagesize(gtPDFDocument1。PageCount、muPixels)。 高さ/ 2); (ドキュメントを保存します) gtPDFDocument1。 SaveToFile( "modified_doc.pdf"); 終わり; 最後にgtPDFDocument1。 フリーエンド;

もちろん、私の仕事に関連して、PDFtoolkitは実際には役に立たないことがわかりました。 私は最初からPDFを作成することに興味がありますが、独自のPDFビューアを作成する人にとっては、このライブラリが適していると思います。

だから、私たちが最終的に持っているもの。 はい5 さまざまなソリューション DelphiでPDFドキュメントを作成および操作するため。 それぞれのソリューションには、長所(無料、「ファンシー」)と短所(馬のコスト、Unicodeの問題など)の両方があります。 私のタスクに関しては、すべてのソリューションが「ファイルを処理する」必要があります。 一方で、たくさんの有料と 無料サービス PDFを生成しますが、そのようなサービスには突然死ぬ可能性があることを念頭に置いて、どういうわけかそれはそれらを引っ張らないのです。 もちろん、もう1つの解決策があります。それは、自分で作成したもので、完全にDelphiテーマではありませんが、次回はそれについて詳しく説明しますが、今のところ、DelphiFeedsのクライアントをどうするかを考えます。


オンラインでお会いしましょう!

トピックの続き:
Wi-Fi

今日は、SamsungAppsに関連するすべての可能な質問を分析します。 不要なものをインストール、更新、削除する方法を考えてみましょう。 そして便利のために...