どのようにhtmlにpdf添付ファイルをレンダリングするのですか?

私は、一般的にpdfであるリードの添付ファイルをすべて取得し、1つのpdfドキュメントにマージするという要件があります。

私は以下のコードを試しました。

str='';
List atts=[select id, body from Attachment limit where parentid=:leadid];
for(Attachment att:atts)
  str+=EncodingUtil.base64Encode(att.body);

私はstrを使ってvfページでそれを表示しています。しかし、それは働かなかった。

任意の回避策/提案は非常に高く評価されます。

ベストアンサー

バイナリデータをまとめて組み合わせて動作させることはできません。このアプローチはいくつかのアカウントで失敗します:

Base64の組み合わせ

Base64は3〜4バイトの変換方法を使用してビットをASCIIで安全にします。副作用として、正確に3の倍数であるファイルだけが、重い処理なしでBase64で一緒に縫い合わせることができます。これは、出力ストリームに
“==”または “=”を付加することによって、Base64がパディングされて出力ストリームを正確に4バイトの倍数にするためです。これは
“ストリームの終了”マーカーとしても機能します。つまり、与えられた2つのbase64文字列:

9jfl4eiajf9aealoicg==
9AOdcjj34Lj932kmca+8=

(注:これは適切な長さのBase64文字で、ランダムな文字であり、パディング付きで、最後の4バイトは適切なターミネータに合わせて調整されています)

9jfl4eiajf9aealoicg==9AOdcjj34Lj932kmca+8=

しかし、 “=”はbase64ストリームの最後でのみ有効なので、失敗します。

さらに、中央の「==」を取り除く:

9jfl4eiajf9aealoicg9AOdcjj34Lj932kmca+8=

また、 “cg == 9AOd”は “cg9AO”とは異なるセマンティクスを持つため、動作しません。

9AOd
11110100 00000011 10000011

cg9A
01110010 00001111 01000000

それが明白でない場合は、9AOdの最初のバイトが11110100で、3番目と4番目のbase64コードの9Aが00001111に変わります。
cg ==から残された余分なパディングは、残りのストリームを4ビットだけシフトさせるので、ファイルは無効になります。

バイナリ形式

しかし、たとえファイルがbase64バイトで整列されていても、バイナリファイルは厳密なフォーマットになっているため、それらを直接マージすることはできません。パーサーは、最後の余分なデータを無効なファイルとして認識し、データをレンダリングしません。添付ファイルの種類や順序がわからない場合、これは二重に当てはまります。たとえば、GIFを最後に貼り付けたPDFは、現代のすべてのソフトウェアでは判読不能なファイルになります。バイナリ形式でまとめられたGIF、JPEG、およびPDFは、一部のソフトウェアによってGIFがレンダリングされる可能性がありますが、残りのデータは余分なデータとみなされて破棄されます。

テキスト形式

XMLやHTMLなどの特定のルールもあります。たとえ文字がテキストであっても、それらを貼り付けるだけで、ウェブブラウザがブラウザを正しくレンダリングすることは期待できません(ただし、ブラウザによっては違いがあります)。構文的に妥当であるとみなされるためには、それらを特定のパターンで一緒にマージする必要があります。また、バイナリとプレーンテキストを混在させることはできません。パーザは単純にバイナリをプレーンテキストとしてレンダリングし、ゴミとして表示します。

データのマージ

だから、この情報を考えれば、自然のものを試すのは絶望的なようだ。しかし、すべてが失われることはありません。
PDFからページを抽出する(@SF_Ninjaには1つの解決策が記載されています)など、データの種類を制限して安全につなげることができるサービスがあります。ただし、PDF、Microsoft
Word文書、3つの画像ファイルを1つのPDFにまとめることは必ずしも可能ではありません。専用のプログラマーは、さまざまな種類のデータを結合するツールを作成することもできます。

ただし、Apexコードでこれが機能するとは思われません。
CPU時間が限られているため、ほとんどのデータ形式をデコードして構文解析するだけで、ガバナの制限が簡単に消えてしまいます。外部処理は、マージが成功するための鍵です。つまり、マージするファイルの種類とその整理方法を特定してから、プロセッサスクリプト(前述のようなもの)を作成してから、それらの間に統合を作成する必要があります。このようなスクリプトは、ほんの一握りのファイルタイプを扱うことはできません。ほとんどのタイプは、組み合わせても意味がありません(たとえば、MIDIとMP3、あなたはPDFとMIDIファイルをどのように組み合わせますか?)

結論

うまくいけば、この答えは、うまく動作する機会を得るために、狭い範囲の機能を定義しなければならないことを理解するのに十分なことを啓発していることです。そこにはあまりにも多くのファイル形式があり、互いに互換性がないため、ソリューションの狭い定義が重要です。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です