3

TL; DR: PHPが合計1ページより長いPDFを生成するのに問題があります。


またあったね。私の目標は、基本的にすべての重要なデータを取得し、印刷/郵送/アーカイブ用のA4形式のPDF請求書/ドキュメントを作成するスクリプトを作成することです。ドキュメントがオーバーフローしない限り、PDFドキュメントの生成は問題ありません。

請求書ページの輪郭を境界線で囲みたいのですが、次のものが含まれている必要があります。

  • 請求書が有効であるために必要なもの
  • 請求商品/その他の情報
  • サプライヤー/顧客の署名とスタンプまたはその他のデータの場所

すべてのページには、ヘッダーとフッター(会社のロゴ)とフッター(ページ番号#-請求書/ドキュメントID-日付と時刻-オフィスID-プリンターID、割り当てられた担当者、誰かが尋ねることができるもの)、および周囲の境界線を含める必要がありますドキュメントの本文(ヘッダーの下、フッターの上)。

ドキュメントのサイズが以下であれば、すべて問題ありません。

$pageSize-$pageMargins-$header-$footer-$invoiceDataBlock-$signaturesBlock

これは基本的に実際の請求項目の10cmと同じです。ドキュメントが大きい場合は、実際にスプレッドシートエディタを使用して請求書の添付ファイルを手動で作成します。

問題は、請求書のアイテムがヘッダー/フッターに重なるなどの問題がない複数ページのPDFドキュメントを作成するにはどうすればよいですか?次のページにいつ進むかを知る必要があります。どうすればこれを知ることができますか?このタスクを実行するための最良の方法は何ですか?

前もって感謝します!

4

2 に答える 2

2

FPDFとTCPDFの両方を使用して、複数ページの請求書ファイルを生成しました。それらは、それらがどのように機能するかという点でほぼ同じです。(私はFPDFから始めて、当時FPDFがサポートしていなかったUnicode文字を含める必要があるときにTCPDFに切り替えました。)

Eugenが提案したように、FPDFまたはTCPDFに組み込まれている関数を使用するよりも、独自のヘッダーとフッターを簡単に手動でロールできます。

フッターを上書きしないようにするための私の戦略は、請求書に含まれるデータに注意することです。新しいSKUを追加するときは、長い名前をテストして、請求書PDFのフィールドに収まるかどうかを確認します。可変長でなければならないアイテムについては、考えられる影響を減らすために、不明なコンテンツを独自の行に配置します。

ドメイン登録(2年
↳example.com

請求書の各ページを生成するときに、使用した行数を追跡します。20行のアイテムを安全に配置できること、および1つのアイテムの最大数が2行であることを知っています。その後、20行に達すると、新しいページを開始します。15アイテムは1ページを意味します。25項目は2ページを意味します。アイテムカウンターが上がり、20行の制限に達するたびに、次のページが生成され、ページアイテムカウンターがリセットされます。

質問にコードが含まれていなかったため、この回答にはコードを含めていないことに注意してください。実装のサポートが必要な場合は、それが追加の質問の根拠になると思います。:-)

于 2012-06-03T02:49:53.090 に答える
1

TCPDFを使用します。非常に便利なSetY() / GetY()機能のペアがあり、ページのどこにいるかを知ることができます。これを使用して、ページ分割をいつ実行するかを知ることができます。

ヒント:ヘッダー/フッター機能は使用しないでください。不格好です。独自のヘッダー/フッターを描画します。

編集

以下の説明から、ここにいくつかの詳細があります:オーバーレイを避けるために2つの可能性があります

  1. 使用getStringHeight()して計算する
  2. トランザクションを使用する

最初のバージョンは、PDFの生成に通常使用するすべてのオブジェクトの中で、テキストフローが唯一のオブジェクトであり、使用する高さを事前に知ることができないという事実からその理論的根拠を引き出しています。getStringHeight()十分な見積もりが得られるので、要素を追加する前に、それがページに収まるかどうかを確認します(フッター用に下部に十分なスペースを残します)。したがって、最初に新しいページを開始する必要がある場合は、基本的に描画ループを拡張して各要素の高さを計算し、テストします。これにより、ある種のまとめも可能になります。たとえば、セクションタイトルの後の残りのスペースが少なすぎる場合は、前に新しいページを開始して、セクションタイトルとセクション本文を一緒に保つことができます。

2番目のバージョンはさらに簡単です。TCPDFでは、データベースと同様のトランザクションを使用できます。トランザクションを開始し、描画します。結果が好みに合わない場合は、コミットします。これはかなりのパフォーマンスの問題であることがわかり、最終的には長いテキストレポートを作成することにしましたが、2ページの請求書はまったく別の獣です。

于 2012-06-02T23:27:31.573 に答える