問題タブ [apple-pdfkit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - iPhone / iPad / iOS 用の高速で無駄のない PDF ビューア - ヒントとヒント
最近、PDF の描画について多くの質問がありました。
はい、PDF を で非常に簡単にレンダリングできますがUIWebView
、優れた PDF ビューアに期待されるパフォーマンスと機能を提供することはできません。
PDF ページを CALayerまたはUIImage に描画できます。Appleには、Zoomable UIScrollview で大きな PDF を描画する方法を示すサンプル コードもあります。
しかし、同じ問題が次々と発生します。
UIImage メソッド:
- PDFは、
UIImage
光学的にスケーリングされず、レイヤーアプローチでもあります。 -
制限
UIImages
からの生成時に CPU とメモリがヒットし、それを使用して新しいズーム レベルのリアルタイム レンダーを作成することができなくなります。PDFcontext
CATiledLayer メソッド:
- 完全な PDF ページを a に描画するかなりのオーバーヘッド (時間)
CALayer
があります: 個々のタイルがレンダリングされているのを見ることができます (tileSize を微調整しても) CALayers
事前に準備することはできません (オフスクリーンでレンダリングされます)。
一般に、PDF ビューアはメモリもかなり消費します。Apple のズーム可能な PDF の例のメモリ使用量を監視することもできます。
私の現在のプロジェクトでは、PDF ビューアーを開発してUIImage
おり、別のスレッドでページをレンダリングして (ここでも問題です!)、縮尺が x1 のときに表示しています。CATiledLayer
スケールが 1 を超えると、レンダリングが開始されます。iBooks は、ページをスクロールすると、鮮明なバージョンが表示される前に、ページの低解像度バージョンがわずか 1 秒未満で表示されるという、同様のダブル テイク アプローチを採用しています。
描画を開始する前にPDF画像がレイヤーをマスクする準備ができるように、ページの両側に2ページをフォーカスしてレンダリングします.ページは、フォーカスされたページから+2ページ離れたときに再び破棄されます。
Drawing PDFのパフォーマンス/メモリ処理を改善するために、どんなに小さくても明白であっても、誰かが何か洞察を持っていますか? またはここで議論されている他の問題はありますか?
編集:いくつかのヒント (クレジット - Luke Mcneice、VdesmedT、Matt Gallagher、Johann):
可能な場合は、メディアをディスクに保存してください。
TiledLayers でレンダリングする場合は、より大きな tileSizes を使用してください
プレースホルダーオブジェクトを使用して頻繁に使用される配列を初期化します。代わりに、別の設計アプローチはこれです
画像は、
CGPDFPageRef
NSOperations
または GCD & Blocksを使用して、事前にページを準備します。CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
beforeを呼び出しCGContextDrawPDFPage
て、描画中のメモリ使用量を減らしますdocRef
NSOperations
で初期化するのは悪い考えです (メモリ)。docRef をシングルトンにラップします。不必要にキャンセル
NSOperations
する 可能な場合、特にメモリを使用する場合は、コンテキストを開いたままにしないように注意してください。ページ オブジェクトをリサイクルし、未使用のビューを破棄する
開いているコンテキストが不要になったらすぐに閉じます
メモリ警告を受け取ったら、DocRef とすべてのページ キャッシュを解放してリロードします。
その他の PDF 機能:
PDF 内のリンクの取得(およびhereおよびhere )
リンクのターゲットを
/Dest
取得する (配列からページ番号を取得する)
検索(およびここ) (すべての PDF で機能するとは限りません (奇妙な文字が表示されるものもあります。エンコードの問題だと思いますが、よくわかりません) -Credit BrainFeeder)
CALayer とオフスクリーン レンダリング- 次のページをレンダリングして高速/スムーズに表示
ドキュメンテーション
- Quartz PDFObjects (メタ情報、注釈、サムに使用)
- 上記 PDF 仕様
サンプルプロジェクト
- Apple/ ZoomingPDF - ズーム
UIScrollView
、、CATiledLayer
- vfr/ リーダー- ズーム、ページング
UIScrollView
、CATiledView
- 眉/葉- 素敵なトランジションでのページング
- / skim - 見た目のすべて (OSX 用の PDF リーダー/エディター)
ios - PDFKit 注釈の内容を入れ替える
注釈を削除したり、新しい注釈を作成したりせずに、注釈のテキスト(つまりcontents
)をPDFKitで変更できますか?FreeText
次のスニペットは、で表示するときに注釈の内容を変更しませんPDFView
。
これは機能しますが、注釈を置き換える必要があります (したがって、注釈の他のすべての詳細をコピーする必要があります)。
注: 同じ注釈の追加/削除も役に立ちません。
ios - PDFKit / PDFView はフォーム注釈との相互作用を無効にします
ofをPDFDocument
持つ注釈を含むの場合、それらの注釈に対するユーザー操作を無効にすることはできますか (つまり、チェックボックスをクリックしても切り替えられません)?widgetFieldType
PDFAnnotationWidgetSubtype.text
PDFAnnotationWidgetSubtype.button
ios - Apple PDFKit - 検証スクリプトを含む PDF の問題。
JavaScript を使用していくつかの検証が埋め込まれた一連の PDF ファイルがあります。日付や時刻の形式、さまざまなフィールドから計算された合計などの検証。
これらの PDF をテストしたところ、Mac Chrome ブラウザー、Windows Chrome ブラウザー、Windows Adobe Reader、iPad Adobe Reader で問題なく動作します。ただし、Apple PDFKit を使用して PDF をPDFView
. 検証、フィールドのフォーマット、または iPad Adobe Reader アプリでのポップアップ検証エラーの発生は行われません。テスト目的で、この pdf をアプリケーションに保持し、そこから直接アクセスしています。
何かが間違っている場合に検証エラー/ポップアップが表示される iPad Adobe Reader アプリと同じ機能を取得することは可能ですか?