2017-10-06 11 views
0

私たちは、モバイルアプリケーションとしてインタラクティブなプレゼンテーションを作成するためのユニバーサルソリューションを考え出したいと思います。最初のアイデアは、PDFファイルを作成して携帯電話で使用することでしたが、うまくいかなかった - それは遅すぎました。もう一つのアイデアは、PDFをSVGに変換してシーン(スライド)として使用することでした。これが私が現在取り組んでいることです。私が言いたいことは、PDFにはページ間を移動するための内部リンク注釈が含まれていることです。重いSVGファイルをレンダリングする(パフォーマンスを改善する)

したがって、PDFからSVGへの変換では、pdf2svg cliツールを使用します。私はまた、PHPのcliアプリケーションを書いて、PDFからのすべてのリンクをその位置で解析しました。概念のために私は最初にこのアイデアをテストするためにReactJSを使用します(私はReact Nativeでこれまでに働いたことはありません)。

問題:PDFには高解像度の画像とページがたくさん含まれているため、SVGファイルのサイズが非常に大きく(最大11MB)、すべてのSVGのサイズが〜70MBです。これらの大きなSVGファイルをレンダリングすると、PDFファイルと比較して遅延があります(〜1〜10秒)ので、読み込み時間を最適化する必要があります。私がこれまで試してみました何

:私が書いた前述のPHP CLIユーティリティを使用して

  1. は、私は、SVGファイル内のリンク(<rect x="..." y="..." width="..." height="..." data-target-page="..." opacity="0"/>)に関するいくつかのデータを置きます。それから私は<object data="..."/>と状態の中のページ番号を含むSVGをレンダリングし、各レンダリングでonClickのイベントリスナーをSVG内の<rect>タグのために作成しました。まあ、それは最初の試みだったし、私はパフォーマンスに満足していなかった。

  2. react-svg-loaderを使用して、コンポーネントとしてSVGを注入しようとしました。それはうまくいかず、パフォーマンスはさらに悪化しました(70 MBのSVGからJSXコンポーネントへの変換は良いとは言えません)。ところで、私は生産のためのプロジェクトを作ろうとしましたが、それはずっと待っていました。したがって、オプションではありません。

  3. SVGの代わりに、より小さい解像度(各PNGは約800kb)のPNG画像を使用して、画像の上にdiv要素としてリンクを配置しようとしましたが、パフォーマンスは本当に良好でしたが、品質が低下しました。そうではありません。

  4. SVGと<img src="..."/>と同じですが、3と同じです。私はそれがやや良いと思っていますが、それでも勝利はありません。

SVGを使用してもパフォーマンスを向上させるにはどうすればよいですか?それはReact Nativeでより良いか悪いか?

+0

SVGはビットマップイメージではなくベクトルを保持します! 代わりにPDFをHTMLに変換したい場合があります。 –

+0

複雑なSVGはレンダリング時間を長くしすぎます。したがって、複雑な図形にはSVGを使用すべきではありません(PDFにはより多くのテキスト、図形を含めることができます)。マークアップ言語を使用して、レンダリング時間をかなり遅くします。 @BorisKはHTMLを使いやすくしています。 –

+0

私は応答性とクロスデバイスサポートが必要なので、HTMLはそうではありません。 – gintko

答えて

1

あなたの問題の主な部分は次のとおりです。pdf2svgはすべてのラスターイメージをbase64-encoded ASCII stringsとしてSVGに埋め込みます。これらの変換とレンダリングは、参照されて外部PNGまたはJPEGファイルに保存されている画像をロードしてレンダリングするよりもかなり長い時間がかかるようです。

私は間違いなく、PDFをインポートする際に埋め込みラスタイメージを余分なファイルに分割するCLIツールについてはわかりません。しかし、GUI SVGエディタのInkscapeは次のことができます:InkscapeでPDFファイルを開くと、ダイアログボックスが表示され、選択するページだけでなく、「すべての画像を埋め込む」オプションが表示されます。このチェックボックスをオフにすると、画像はPDFフォーム内からロードのみ参照されているディレクトリに個別のファイルとして保存されます

<image xlink:href="image0.png" ... /> 

私の提案は、すぐに「プレーンSVG」としてインポートされたページを保存することです生成されたSVGの構造が少し畳み込まれているので、フォルダとパスを他のツールで変更することができます。検索と置換のルーチンで<image>タグを見つける方が、Inkscape内で検索するよりも簡単です。

もう1つの方法は、最初に画像を埋め込むことです。彼らはすべてのあなたは、いくつかの検索ツールwiht SVGからそれらをextrectして、イメージファイルにuudecodeでそれらをデコードして、参照を持つデータ列を置き換えることができ、フォーム

<image xlink:href="data:[<mediatype>][;base64],<data>" ... /> 

を持っています。

関連する問題