PDFを高解像度でドローする機能

PDFを高解像度でドローする機能

CGContextDrawPDFPageで関数、ともかくPDFは描画できるようになるが、ここで大きな問題が生じる。ズームなどをうまく処理したら、大きく拡大してみよう。CGContextDrawPDFPageでの描画結果は解像度はあまり高くなく、ちょっと拡大してもぼやけた画像しか見えない。特に、テキストがぼやけるのはいやがる人が多いだろう。

そこで、もっと解像度を高くできないかということになる。その手法は用意されているが、ここではCore Animation(以下CA)の仕組みが絡む。CAで定義されているレイヤーという機能があり、ビューはいくつかのレイヤーで構成されている。そこをうまく利用すれば、解像度の高いつまりは拡大してもぼやけないPDFの描画ができる。

ここからは、「Quartz 2D Programming Guide」ではなく「Scroll View Programming Guide for iOS」に移ろう。もちろん、CAのドキュメントは参照したいところだが、まずはPDF、という方は先にスクロールビューのドキュメントを見た方がいい。

また、サンプルプログラムの「ZoomingPDFViewer」も要チェックだ。こうしたPDF機能のカギになるようなことがなぜかスクロールのところに書かれている。とは言え、結局のところ拡大縮小やスムーズなページ移動などを組み込むことになるので、「Scroll View Programming Guide for iOS」はじっくりと全部読むことをお勧めする。

高解像度のPDF描画は、「Scroll View Programming Guide for iOS」の「Ensuring that Zoomed Content is Sharp when Zoomed」の部分や、サンプルプログラムの「ZoomingPDFViewer」を参照すれば記載がある。要は、drawRectによって描画をさせるのではなく、UIViewを継承したクラスで、drawLayer:inContext:というメソッドを用意して、そこでPDF描画をするのがキモだ。

こうすれば、確かに拡大してもぼやけないようになるが、描画が目に見えて遅くなる。タイル上に描かれる(ちなみに、FileMaker Goの初期バージョンではその様子がつぶさに見えていた)。サンプルプログラムの「ZoomingPDFViewer」では、それをうまくごまかすために、一度解像度の低いPDFページのピクチャを作ってまずはビューに配置し、それに重なるようにdrawLayer:inContext:で高精細度でPDF描画するビューを重ねると、描画に1、2秒かかるにしても、ユーザーにはそれが見えないようになるというわけだ。

図5:UIWebViewを利用したPDF表示。単に表示するだけなら、この方法は一番手軽で確実(クリックで拡大)図6:DrawRectをオーバーライドして描画した画面をズームしてみた。描画したときの解像度のまま変化しないので、拡大すると荒れた画像になる(クリックで拡大)図7:drawLayer:inContext:オーバーライドして描画すると、解像度に追随して拡大しても画像は荒れない(クリックで拡大)

スムーズなスクロールをサポートする機能

描画の方法はここまで紹介した方法の通りだが、次のページに移動するなどの処理はここから作り込む必要がある。サンプルプログラムは、UIWebKitを使う方法以外は1ページ目しか表示していない。こうして1ページずつ表示をしようというわけだ。

結果的にページスクロールをあれこれ画策することになるが、それも「Scroll View Programming Guide for iOS」に書かれている。「Scrolling Using Paging Mode」というチャプターと、サンプルコードの「PageControl」をチェックしよう。あるページを表示しているときに、ドラッグすると次のページが見えながら次のページに移動するような仕組みは、ここに書かれていることが基本となる。

さて、PDFはこれがすべてではない。仕様書が500ページを超えるPDFのすべてがこれで表示できるわけではない。まず、注釈(アノテーション)については上記の方法では表示できない。自分でPDFの中身を解析して、必要な情報を取り出し、矢印やテキストを自分で描画する必要がある。PDFの解析方法は「Quartz 2D Programming Guide」の「PDF Document Parsing」にあるが、サンプルもなくそう簡単には行かない。地道な作業が待っている。

暗号化されているPDF、アタッチメント、リンクなどなど、PDFの機能は枚挙に暇がないほどたくさんある。iOSのCGによる描画はこれらの一部だけがサポートされている。プログラムの作成前に、どこまでのサポートが必要なのかをきっちりと定義してから始めることをお勧めしたい。OSのサポートでうまく行く範囲と、自分で解析する範囲を見極めて作業にかかろう。

4回にわたって、iPad、iPhoneを取り巻く環境から、iOSのバージョンの違い、ゲーム、出版それぞれのプラットフォームとしての評価などについて取り上げてきたが、いかがだっただろうか。iPhone、iPadのみならず、スマートフォンやタブレットの可能性は無限に広がっている。その発展をこれからも見守っていきたい。

  • 編集部注:サンプルソースがダウンロードできない問題を修正しました。(2011/2/1)

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30