問題タブ [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 アプリと同じ機能を取得することは可能ですか?
cgrectmake - キャッチされない例外 'CALayerInvalidGeometry' が原因でアプリを終了しています。理由: 'CALayer の位置に NaN が含まれています: [nan nan]'
問題はXCode 10.2.x
私が推測するように始まりましたが、それはうまく機能していましたXCode 10.1
クラッシュ ポイントはpdfView.frame = self.view.frame
、以下のコードの" " です。
クラッシュログ:
ios - PDFKitを使用してpdfで選択したテキストを強調表示する方法は?
私は PDFViewer をセットアップしましたが、ハイライト機能を追加して、ユーザーがテキストを選択したときにハイライトできるようにしたいと考えています。メモや iMessage などでテキストを強調表示すると、すべてを選択、コピー、貼り付けなどのオプションがあります。これをどのように編集して、強調表示機能も使用できるようにしますか? また、ユーザーがアプリを閉じて再度開いたときに、強調表示されたテキストを引き続き表示できるように、アプリケーションは強調表示をどのように保存しますか? これには、コアデータまたは何か他のものを使用する必要がありますか? ありがとう!
swift - PDFView から選択できない
PDFドキュメントで選択したテキストを強調表示するためのこのコードをどこかで見ます:
私のため 、
選択してみましょう = pdfView.currentSelection?.selectionsByLine()
常にnilを与えています。このコードを配置する場所。Gesture Recogniser Delegate メソッドに入れました。
また、ページに複数の注釈を追加しているようです。ページ上の選択ごとに 1 つのハイライト アノテーションを取得しますか?
ios - iOS PDFKitはPDFViewでPDFフレームを調整します
高さの異なるページを含む PDF を、一度に 1 ページずつ、ページ間に隙間なく、各ページの上部をビューの上部に揃えて、水平方向にページ形式で表示したいと考えています。例えば:
PDFKit
特にこれらの設定は次のPDFView
方法で実現できるため、を使用したいと思います。
ただし、これにより次の結果が生成されます。
これは、ページの高さが異なるためです。各ページは の垂直方向の中央に配置されPDFView
、ページの高さがビューの高さよりも大きい場合 (ページ 2 など)、収まるように縦横比が調整されます。
最初の問題である垂直オフセットを解決するために、いくつかのことを試みました。まず、これは大雑把で、ビュー階層を調べてPDFTextInputView
、ページがレンダリングされるプライベート ビュー ( という名前のクラスのビュー) を見つけた後、そのフレームorigin.y
を0
最も外側のスクロールビュー (別のプライベート ビュー) がスクロールします。これは、次または前のページがビューにスクロールされるたびに、ページがビューの上部にレンダリングされるという点で機能します。ただし、ユーザーがそのページをピンチしてズームすると、そのフレームは自動的に中央に戻ります。このアプローチは、プライベート ビュー階層に依存することを除けば、うまくいきません。
「背の高いページの問題」(ページ 2) を解決するために、新しいページが表示されるたびに PDFView の倍率を調整してみました。悲しいことに、.PDFViewPageChanged
通知はスクロール ビューの減速が終了した後にのみ発生するため、スクロール イン時にページがズーム アウトされ、スケール ファクターを調整すると、画面の幅に合わせてジャンプします。次に.PDFViewVisiblePagesChanged
、次/前のページが表示されると起動する に目を向けました (さらに数回、これで問題ありません)。これには と同じ問題があり.PDFViewPageChanged
ます。
私が試した他のこと:
transform
ドキュメント ビューの調整- ピンチ ジェスチャをインターセプトし、ドキュメント ビューの中心を調整する
- 独自のページコントローラーを作成し、ページごとに 1 つの PDF ページをレンダリングします (を使用しない
pdfView.usePageViewController
)
私が求めているものをどのように達成できるかについて、誰かアイデアはありますか?
swift - Swift PDFKit を使用した PDF サイズの増加
Apple の基本的な PDF フレームワークを使用して、MacOS 用の Swift で小さな PDF マージ アプリケーションを作成しました。基本的な戦略は、PDF ファイルのリストを取得し、2 番目から n 番目のファイルのページを反復処理して、それぞれを最初のファイルの末尾に追加することです。コア機能は次のコードです。
これはほとんど問題なく動作し、私自身もかなり定期的に使用しています (時々、謎のクラッシュが発生し、まだ修正方法を理解していませんが、今日はそれについて質問していません)。
しかし、結果としてマージされたファイルのファイルサイズが非常に大きくなることがあります。たとえば、今朝、ダウンロードした電子書籍の章をマージするためにそれを使用しました。個々の章の合計サイズは ~165 MB でした。ただし、アプリケーションを使用してマージした後、500 MB を超えるファイルになってしまいました (!!!)。
そこに出回っている多数の PDF 結合 Web サイトの 1 つを試してみたところ、はるかに妥当な 200 MB 以下のファイルが得られました。
それで、誰かが私が間違っていることを理解するのを手伝ってもらえますか?
アップデート
もう少し作業を進めた結果、ここでの問題は Apple の内部にあると考えるようになりました。特に、以前と同じ PDF 結合サービスを使用して、別の結合 PDF を作成しました (興味のある方は、smallpdf.com をご覧ください)。40MB弱でした。次に、現在のバージョンの Preview (MacOS 10.15.6 に組み込まれている) でその pdf を編集し、いくつかのページを削除して再保存しました。データを削除しただけの再保存されたファイルは、ほぼ 80MB になりました。
したがって、何らかの理由で、Apple が PDF の書き込みを処理すると、私のコードと Apple 自身のコードの両方で、ファイル サイズが通常の 2 倍になるようです。
swift - PDFView内のPDFPageでPDFAnnotationをどのように移動しますか?
私は PDFKit を使用しており、Apple Preview App と同様に、PDF 注釈を追加するときに、ユーザーがそれらをページ上で移動できるようにしたいと考えています。Github でサンプル プロジェクトを作成しました。
PDFView をサブクラス化し、 and をオーバーライドしようとfunc mouseDown(with event: NSEvent)
しましfunc mouseDragged(with event: NSEvent)
た。そのコードを共有することはできますが、間違った方向に向かっているという直感があります。(そのコードを機能させることができないという事実によって、その気持ちが裏付けられていると思います...)
編集: PDFView に次のコードを追加しました。動作しますが、エレガントには動作しません。プレビュー アプリの動作ほどスムーズではありません。ここで学ぼうとしているだけなので、誰かがもっと良い方法を持っているのではないでしょうか?