2

さまざまな幾何学的形状や多角形、ランダムな画像などのグラフィックや画像を含むフラッシュコンテンツを取り、それらを PDF に変換するアプリのアイデアがあります。

また、このアプリは複数のユーザーが使用することを想定しているため、このプロセスを迅速かつスケーラブルにしたいと考えています。私が考えられる解決策の 1 つは、上記のグラフィックスと画像を組み立てる機能を備えた小さなフラッシュ クライアントを用意することです。ある種の XML を生成し、iText を使用して PDF をレンダリングできる Java プロセスを実行しているサーバーに送信します。

それを行うための他の可能な方法やベストプラクティスは何だろうと思っていました。テクノロジーは問題ではありません。オープンソースまたは商用。

画像のアップロードなどにはさまざまな時間がかかることを理解していますので、画像はすぐに入手できると考えてください。PDF レンダリングのソリューションで私が探しているものに関する基準は次のとおりです。

  1. PDF レンダリング エンジンのため、Flash クライアントに制約はありません。
  2. 複数のユーザーに拡張可能
  3. 速度と効率
  4. シリアライゼーション/デシリアライゼーションの最小量

技術スタックのアイデアを共有していただければ幸いです。どうもありがとう!

PS: Flash >> XML >> Java のアプローチにとらわれないでいただければ幸いです。数あるアプローチの一つだと思います。

4

4 に答える 4

3

Flash を使用してブラウザで PDF を生成するオプションがある場合は、AlivePdf の使用を検討してください。そうでない場合は、XSL:FO をチェックしてください。サーバー側で PDF に変換するために使用します。

于 2010-12-31T13:54:56.930 に答える
1

iText は Java コードで PDF を生成すると思います。データ ソースとして XML を使用する場合と使用しない場合があります。POJO も同様です。

別の方法は XSL-FO です。XML を変換して PDF を生成するには、XML データ ソースと XSL-FO スタイルシートが必要です。Apache の Xalan (またはその他の XSL-T ライブラリ) がそれを行います。

「クイック」と「スケーラブル」には、それ以上のものが必要になる場合があります。大量の画像のアップロードは、PDF とは関係のない独自のタイムスケールと最適化を伴うプロセスです。

于 2010-12-31T13:54:32.353 に答える
1

PHP 用のpdflibFPDF (PHP 用もあります) があります。

于 2010-12-31T13:57:57.137 に答える
0

では、他のクライアントも検討してみませんか?子供向けの描画アプリを持っていて、その時点での描画の状態を保持するものを生成したいと考えているようです。

はっきり言って、XML はそれほど効率的ではありません。それはその目的ではありません。機械と人間の両方で読み取り可能、検証可能などです。

代わりに、そのキャンバスの状態を JSON でサーバーに送信するベースの Web ページはどうでしょうか<Canvas>(バイト数が少なく、それらを構築する作業も少なくなります)。サーバーは、必要な地獄のライブラリ/言語で動作できます。多くの JSON->my-language ライブラリがあちこちに浮かんでいます。

PDF ライブラリの選択は、サーバーにインストールされているものによってのみ制限されます。また、読み書きをできるだけ少なくしたいとおっしゃいました。

最も効率的なセットアップは、キャンバスの変更 (イメージを含む) の影響を最小限に抑えるように調整された、読み取り専用の部分的な PDF を既にメモリにロードしておくことです。各セッションは、その部分的な PDF を複製し、JSON を PDF グラフィック コマンドに変換し、PDF を保存します。

PDF の構造的な変更を最小限に抑えるには、インライン画像を使用します。PDF に新しいオブジェクトがないということは、クロス リファレンス テーブルをまったく変更する必要がないことを意味します (フォントを追加するか、既存の画像を再利用するまで)。オブジェクト間に特定の量のスペースを埋め込んだ「ドキュメント情報」ディクショナリを作成して、バイト オフセットを変更せずに入力できるようにすることができます (外部参照テーブルを再計算する必要があります)。

ページサイズをいじる必要があるかもしれませんし、必要ないかもしれません...ここでは1ページについて話しているだけですよね?

したがって、PDFは次のようになります...

%%PDF-1.6
<3-4 random high order bytes to convince folks that we're a binary stream>
1 0 obj
<</Type/Catalog/Pages 2 0 R>>
endobj
2 0 obj
<</Type/Pages/Count 1/Kids[3 0 R]>>
endobj
3 0 obj
<</Type/Page/Contents 4 0 R/MediaBox[0 0 612 792]/Parent 2 0 R>>
endobj
5 0 obj
<</Type/DocInfo/Author()  --<insert big whitespace gap here>-- 
/Title() --<ditto>--
/Subject() --<ditto>--
/Keywords() --<ditto>--
/Creator(My app's Name)
/Producer(My pdf library's name)
/CreationDate(encodedDateWhenThisTemplateWasBuilt) D:YYYYMMDDHHMMSS-timeZoneOffset
/ModDate() --<another, smaller whitespace gap>--
>>
4 0 obj
<</Filter/SeveralDifferentFiltersAvailable/Length --<byte length of the stream in this file>-->>
stream

そして、あなたのテンプレートはそこで止まります。同様の「PDF の終わり」テンプレートは、次のようになります。

endstream
endobj
xref
0 6
0000000000 65535 f 
0000000010 00000 n
0000000025 00000 n
0000000039 00000 n
0000000097 00000 n
0000000050 00000 n
trailer
<</Root 1 0 R/Size 6/Info 5 0 R>>
startxref
--<some white space>--
%%EOF

最後の数字の列はすべて間違っています。最初の列は、その特定のオブジェクトのバイト オフセットです (そして、今はバイト数を数えることができません)。2 番目の列はほとんど無関係です。

PDF入力アプリは次のことを知る必要があります:

  1. 最初のテンプレート内に入力する予定のすべてのバイト オフセット。
    1. ちなみに、すべての「ドキュメント情報」フィールドはすべてオプションです。/Info キーとそれが指す辞書はオプションです。あなたが気にするなら、それらを引っ張ることができます。
    2. コンテンツ ストリームの /Length キー。これは、ストリーム自体のフィルター後のバイト長である必要があります。
  2. JSON を pdf 描画コマンドに変換する方法。少しごまかしたい場合は、iText [Sharp] の PdfContentByte クラスを使用し、その描画コマンドを使用して、完成したバイト ストリームを取得し、それを PDF に平手打ちすることができます。必ずインライン画像を使用してください。そうしないと、このスキーム全体が窓の外に出てしまいます。必要に応じて、同様に消化できる他のライブラリがおそらくあるでしょう。または、PDF の仕様を読んで、自分で作成することもできます。PDF のコンテンツ構文のかなり限定されたサブセットに固執することになります。
  3. ファイルの先頭からの単語「xref」のバイト オフセット。これを計算できます: LengthOfInitialTemplate + LengthOfContentStream + OffsetFromStartOf2ndTemplateTo'xref'.
  4. 「startxref」の下の行のバイト オフセット。これは、「xref」の事前に計算されたバイト オフセットを書き込む場所です。

それ以上の効率は得られません。テンプレートを一度読んだことがあります。一度必要なバイト オフセットを読み取り/計算します。

于 2010-12-31T17:56:30.053 に答える