私はPDFをユーザーとしてだけでなく、最初に、それを読み書きできるソフトウェアの開発者として扱っています(PDFで動作するABBYY製品-ABBYY FineReader、ABBYY PDF Transformerに出くわしたことがあります)。 記事
habrahabr.ru/company/abbyy/blog/105006を読んでから、上級ユーザーにとってより興味深いPDFのいくつかの機能と制限についてのみ書くことを想定しています。 複雑な技術的な詳細については触れないので、
www.adobe.com / devnet / pdf
/ pdf_reference_archive.htmlから仕様バージョン1.7を読むには、PDFの読み取りまたは書き込みの方法を学びたいプログラマーの方が良いでしょう。
PDFの目的と機能
当初、PDF形式は前世紀の80年代後半にAdobeによって、異なるマシンやプラットフォームでオリジナルと同じ形式で表示および印刷できるページ構造化文書の「電子ハードコピー」として考えられていましたが、編集されることはありません。 この定義は、人間が読めるドキュメントを保存および配布するためのPDFを他のほとんどの形式と区別します。 PDFは長年にわたって大きく進化しており、現在、さまざまなコンテンツ(テキスト、ベクターおよびビットマップグラフィック、インタラクティブ要素、フォーム、オーディオ、ビデオ、さまざまな種類の注釈)のコンテナーとなっていますが、その本来の目的は依然としてその機能の源泉です、および多数の制限。
したがって、テキストドキュメントの形式(DOC、RTF、DOCXなど)は、主に表示ではなく、ドキュメントの編集に焦点を当てています。 合理的なユーザーが作成します:)ドキュメントは、テキスト、写真、さまざまな場所の表の挿入/置換/削除、ページのサイズとマージンの変更、任意のサイズのテキストフラグメントのフォーマットの変更などに論理的に反応します。 HTML Webページはあまり編集指向ではありませんが(許可されていますが)、作成者の直接の手で、通常は作成者の画面の画面だけでなく、まったく異なる画面とユーザーの操作を備えたデバイスでも表示を許容します。
PDFには特別な方法があります-文書が最初から作成されない寄生形式として最も広く使用されていましたが、多くの場合、深い機械処理によって他の形式から生成され
、文書を
表示するために不要な詳細の多くまたはすべてを失います固定ビュー。 PDFを取得する最も一般的な方法は、メニューに「印刷」コマンドがあるアプリケーションから仮想PDFプリンターに印刷することです。
PDFプリンターは、GDI(「グラフィックデバイスインターフェース」)-シンボル、ライン、曲線、長方形、ラスターイメージ、およびその他の幾何プリミティブを、対応するPDFコマンドの適切な場所に出力してファイルに保存するコマンドを変換します。 この場合、もちろん、印刷が実行されたページの数とサイズが保存されます。
このような変換は、印刷前に起こったことの外観を非常に正確に伝えることができます(たとえば、線と記号はどの縮尺でも鮮明さを失わず、非常にコンパクトに保存されます)が、出てきたドキュメントのデバイスを完全に無視します。 たとえば
、単語またはテキストの他の断片を強調するために、PDFには文字の専用のコマンドまたは属性がありません-代わりに、文字は別々に表示され(通常は単語または行と一致しないグループで)、必要な太さと色の線または細い長方形が別々に描画されますページの適切な場所。 PDFを表示するアプリケーションの場合、人がセルの不可欠なセットとして認識するテーブルは、偶然、人がテーブルとして認識する何かを形成する文字と行の混oticとしたセットにすぎません。 ドキュメント内のナビゲーションとWebアドレスへの移動の両方に元のドキュメントで使用できるハイパーリンクは、印刷時のナビゲーションツールとして消え、色付きまたは下線付きのラベルのみが残ります。 一般的に、堅実な模倣と詐欺。 このようなPDFを、以下では「ベクター」と呼びます(ベクターコマンドで構成され、文字を描画します)。
PDFドキュメントを取得する別の方法は、近年特に人気が高まっていますが、スキャンした紙のページを処理することです。 現在、ほとんどのスキャナーと多機能デバイスは「ラスター」PDFの形式で結果を生成できます-「印刷のシミュレーション」という以前の方法は不要であり、デバイスのドライバーまたはユーティリティはPDFページを個別に形成し、それぞれが目的の「ラスター」イメージを持つようにします。幸いなことに、PDFで使用できるグラフィック形式のセットは、ほとんどのクエリをカバーしています。 このような「ラスター」PDF文書は、「ベクター」文書よりも多くのスペースを必要とし、品質が劣ります。
一部の最新のアプリケーション(OpenOfficeスイートのアプリケーション、Microsoft Officeの新しいバージョン、ABBYY FineReaderおよびABBYY PDF Transformerを含む)は、PDFプリンターよりもはるかに多くのツールを使用して独自にPDFを作成できます。プリンタに渡す必要があります。 これにより、たとえば、ハイパーリンクをそのまま(色付きテキストや下線付きテキストだけでなく)保存したり、低解像度画面で再フォーマットおよび表示するためのドキュメント構造の一部の要素を記述したりできます。 このような構造情報を含むドキュメントは、「タグ付き」または「タグ付き」PDFと呼ばれます。 Adobeによると、Acrobat 5以降に追加された「タグ付け」は、以前のバージョンのPDFの最も顕著な欠点を隠すことを目的としています。 たとえば、タグなしドキュメントの場合、テキストフラグメントをWindowsクリップボードにコピーするためのメカニズムの適切な動作(一般的なコピーペースト)は保証されていません。 ただし、今日でも、作成されたすべてのPDFがタグ付けされるわけではありません。ジェネレータプログラムの機能が制限されている(設定でこれにチェックマークを有効にする場所がユーザーに知識がない)ため、または単にそのようなPDFのサイズが大きいために、本当に暑いためです大規模なアーカイブを保存するときにディスク容量を節約する問題。
PDFドキュメントを他の形式に変換する
PDF文書の内容を編集したり、他の、好ましくは編集可能な形式に変換したい(即時編集と、「いつか」検索/編集できるストレージの両方)ことは、さまざまな理由で発生します。 テキストコンテンツを抽出する最も簡単な手段は、PDFを表示するアプリケーションによって提供されます-通常、非常に原始的に機能するコピーペーストがあります-原則として、文字と段落の書式設定は失われ、PDFドキュメントの表と複雑なレイアウトは無視されます。 他の形式に変換せずにPDFを「ポイントイン」編集できるアプリケーションがありますが、その編集ツールの備品は非常に限られており、通常のワードプロセッサとは比較できません:)多くのドキュメント用の高価なAdobe Acrobatでは、唯一の機能する編集は「注釈」です-コメントの追加、マーカーでのテキストの強調表示、取り消し線などのツールがあります。 はい、より高度な編集がそこにあるようですが、偶然、「選択のすべてまたは一部に利用可能なシステムフォントがありません。」という面白いメッセージを見たことはありません。 現在選択されているフォントを使用してテキストを追加または削除することはできません。「Acrobatで「良い」、「ベクトル」PDF文書から文字または単語を無害に削除しようとすると? しかし、行の断片をより長いものに置き換えて、悲しいことに、右に忍び寄る行の尾を見てみませんでしたか? そうでない場合、アドビ製品の愛はまだ来ていません! ワードプロセッサの簡単で馴染みのあるタスク(たとえば、列全体やページ内のテキストの配置を変更しながら、ドキュメント全体で数秒で「MS」という単語を「Microsoft」に置き換える」などの「編集」は価値がありません。
最高の機能を備えた変換ツールを製造するソフトウェア業界で業界全体が形成されたことは偶然ではありません。 上記(特に以下)で書かれたことから、これがいかに難しいかが明らかになるはずです。 このクリエイティブを読んでいないほとんどのユーザーはそうは思わない-だから私はそれを書いている:)
PDFを他の形式に変換する際の主な問題
多くの場合、PDF関連の問題を議論するとき、「テキストレイヤー」という用語が使用されます。 直観的に、多くのユーザーは、目に見えないが検索で見つけられるか、マウスで強調表示される可視テキストのすべての必要な特性を論理的かつ明確に説明する強調表示された部分があると仮定します。 私はあなたに恐ろしい秘密を伝えたいです(おそらく、近い将来、PDF形式の作者と彼らのマーケティング部門から送られた殺人者から弾丸を手に入れるリスクがあります)-PDFにはこの意味でのテキスト層はありません! 実際、各ページには、それを描画するための共通のコマンドストリームがあり、さまざまな種類のコマンドがランダムに混合されています-クリッピング領域の設定、現在の太さ、点線の色とパターンの変更、座標系の変更、フォントの変更、直線と曲線の描画(現在の属性で) 、現在の属性と指定された「グリフ番号」(グリフ-他の特性を考慮せずにシンボルの画像の説明)を含む文字のグループを表示する、ビットマップ画像などを表示する つまり、特別なテキストコマンドでさえ、別々のストリームに割り当てられない多くの描画ツールの1つにすぎません。
さらに悪いのは、1つのPDFページの制限内であっても、目に似たテキストの(あまりにも)広い範囲の画像手段を使用できることです:文字は、ロゴなどのビットマップ画像の一部として見ることができます(それらを認識するタスクは、OCRアプリケーションの純粋なタスクです、同じABBYY FineReader)、ベジェ曲線または特別なテキストコマンドで描画した結果。 この最後のケースは処理に最適ですが、Unicodeまたは他のエンコーディングから一般的に受け入れられている文字コードは必ずしも示されていません-実際に使用される文字のみのサブセットから特別なフォントをPDFファイルに書き込み、完全に任意の「グリフ番号」を使用して文字を参照できるため、コードではありません。 つまり、適切な場所でキャラクターを検出し、そのコードを決定する方法は必ずしも簡単ではありません! 正確なアナログがない場合に類似のフォントを選択するなどの書式設定では、さらに複雑です。
シンボルは、その存在とコードが何らかの方法で設定されていても、ページへの出力の順序でのページ上の配置と読み取りの初期シーケンスに対応しないことが非常に多くあります。 たとえば、2列のページでは、右列と左列からテキストを出力するコマンドをランダムに混在させることができます。 このようなページでは、論理的に一貫したテキストが配置されているそれぞれの領域を強調表示する必要があります-これも長年
OCRアプリケーションによって解決されてきたタスクです。 タグ付きPDFからの構造情報は、ある程度の助けになりますが、PDFプリンターを介して出力する場合など、この情報が不足している場合や、完全ではない場合があります。
ページのいくつかの場所に一貫したテキストがあることを決定したとき(そして、どこかにそれがテーブルにグループ化される方法を理解しました-これは非常に重要なタスクです!)、そしてどの文字と行が追加されるかを見つけたので、これらの行を段落に変換する必要がありますワードプロセッサとHTMLの両方のユーザーになじみのある高レベルの要素-列、表、フレーム。 通常、PDFの段落書式に関するデータはないため、これらすべての特性も計算する必要があります(すべて同じ認識と同様)。 行や段落よりも複雑なテキスト要素を無視して、すべてを短いボックスに出力すると、実際のドキュメントのように見えますが、ほとんど編集されません。ドキュメント全体で「MS」という単語を「Microsoft」に置き換える作業を覚えていますか? これは非常に優れた編集テストです。 編集可能なドキュメントでは、テキストが1つのゾーンから別のゾーンに流れる能力が重要です-必要な場合には、不要なものと区別できる必要があります。
このすべてを行うだけで、PDFの内容を、元の作業に便利な編集可能なファイルに変換できます。 もちろん、長年にわたって、さまざまな企業の多くの優秀な人々がこれらの問題をそれぞれうまくまたは優れた方法で解決することを学びましたが、私はまだ問題全体の理想的な解決策を満たしていません。 しかし、私たちはそれに取り組んでいます:)
ヴャチェスラフ・サプロネンコ・
スラサプロテキスト認識製品部