2012-06-02 2 views
3

TL : DR : PHP가 PDF의 1 페이지를 초과하여 생성하는 데 문제가 있습니다.PHP의 다중 청구서/문서


안녕하세요. 내 목표는 기본적으로 모든 중요한 데이터를 가져 와서 인쇄/우편/보관을위한 A4 형식 PDF 인보이스/문서를 만드는 스크립트를 만드는 것입니다. 문서가 오버플로되지 않는 한 PDF 문서를 생성해도 문제가 없습니다.

나는 송장 페이지가 테두리로 설명되고 싶지, 그것은이 포함되어 있어야합니다

  • 송장에 필요한 필요한 물건이 유효
  • 청구 제품/기타 정보 공급 업체에 대한
  • 장소로/고객 서명 및 스탬프 또는 기타 데이터

모든 페이지에는 머리글 및 바닥 글 (회사 로고) 및 바닥 글 (페이지 # - 송장/문서 ID - 날짜 및 시간 - 사무실 ID - 프린터 ID, 할당 된 직원, 다른 사람이 물을 수있는 곳), 문서 본문 주위의 테두리 (머리글, 바닥 글 위).

다 괜찮 한 문서 크기이기 때문에 크지 기본적으로 실제 청구 항목에 대한 단지처럼 10cm입니다

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

보다. 문서가 커지면 실제로 스프레드 시트 편집기를 사용하여 인보이스에 대한 첨부 파일을 수동으로 만듭니다.

질문 : 머리말/꼬리말에 오버레이 된 인보이스 발행 상품과 같은 문제가없는 여러 페이지 PDF 문서를 만들려면 어떻게해야합니까? 나는 다음 페이지에서 계속할 때를 알 필요가있다. 어떻게 알 수 있습니까? 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

미리 감사드립니다.

답변

1

TCPDF를 사용하십시오. 그것은 아주 편리한 SetY()/GetY() 한 쌍의 기능을 가지고있어서 페이지에있는 곳을 알 수 있습니다. 이것을 사용하여 페이지 나누기를 수행 할시기를 알 수 있습니다.

힌트 : 머리글/바닥 글 기능을 사용하지 마십시오. 그들은 거추장 스럽습니다. 머리말/꼬리말을 그립니다. 아래의 논의에서로

편집

, 여기에 몇 가지 세부 사항은 다음과 같습니다 당신이

  1. 사용 getStringHeight() 2 가능성

    을 가지고
  2. 사용 거래

을 계산 오버레이 방지하기 위해 첫 번째 버전은 그 사실을 근거로 그 이론적 근거를 끌어냅니다. PDF를 생성 할 때 텍스트 흐름을 사용하는 것이 유일한 방법이며, 사용하는 높이를 미리 알 수는 없습니다. getStringHeight()은 충분한 예상치를 제공하므로 요소를 추가하기 전에 페이지에 맞는지 확인해야합니다 (바닥 글의 바닥에 충분한 공간이 있음).기본적으로 드로잉 루프를 확장하여 새 페이지를 먼저 시작해야하는 경우 각 요소 및 테스트의 높이를 계산합니다. 이것은 또한 일종의 keeptogether를 허용합니다. 섹션 제목 뒤에 남아있는 공백이 너무 적 으면 섹션 제목과 섹션 본문을 함께 유지하기 전에 새 페이지를 시작하십시오.

두 번째 버전은 더 쉽습니다. TCPDF에서 데이터베이스에 트랜잭션을 사용할 수 있습니다. 결과를 원하는대로 되돌릴 수 없으면 트랜잭션을 시작하고, 그렇지 않으면 커밋하십시오. 우리는 이것이 상당히 성능이 뛰어나 긴 텍스트 보고서를 위해 궁극적으로 그것을 결정했지만, 2 페이지 인보이스는 매우 다른 짐승입니다.

+0

답변 후보가있는 것 같습니다. – lmojzis

+0

필자는 몇 주 전 팔꿈치에 이르기까지 : 추악한 고아 또는 과부가없는 텍스트 (긴 단락 및 이미지) 보고서 작성. 'GetY()'부터 단락이 페이지에 맞을 경우 (footer를 중첩하지 않고)'getStringHeight()'를 사용하여 계산합니다. –

+0

Hmmm ... 꽤 괜찮아 보입니다. 이 예제를 약간의 예제와 함께 게시하면 좋을까요? 대답으로 표시 할 수 있습니까? – lmojzis

2

FPDF와 TCPDF를 사용하여 다중 페이지 송장 파일을 생성했습니다. 그것들은 어떻게 작동하는지에 관해서는 대략 동일합니다. (FPDF로 시작한 다음 TCPDF로 전환하여 FPDF가 당시에 지원하지 않은 유니 코드 문자를 포함해야했습니다.)

Eugen이 제안했듯이 자신의 머리말과 꼬리말을 FPDF 또는 TCPDF에 내장 된 기능을 사용합니다.

필자가 바닥 글을 덮어 쓰지 않도록하기위한 전략은 단순히 인보이스에 포함 된 데이터를 신중하게 다루는 것입니다. 새로운 SKU를 추가 할 때 필자는 긴 이름을 테스트하여 인보이스 PDF의 해당 필드에 맞는지 확인합니다.

도메인 등록 (2 년)
example.com

: 가변 길이를해야합니다 항목의 경우, 나는 미칠 수있는 영향을 줄이기 위해 자신의 라인에 알 수없는 내용을 넣어 인보이스의 각 페이지를 생성 할 때 사용 된 행 수를 추적합니다. 나는 20 줄의 아이템을 안전하게 넣을 수 있고, 최대 하나의 아이템이 2 라인이라는 것을 알고 있고, 20 라인이되면 새로운 페이지를 시작합니다. 15 항목은 1 페이지를 의미합니다. 25 개 항목은 2 페이지를 의미합니다. 항목 카운터가 올라가서 20 줄 제한에 도달 할 때마다 다음 페이지를 생성하고 페이지 항목 카운터를 다시 설정합니다.

질문에 코드를 포함시키지 않았기 때문에이 대답에 어떤 코드도 포함되어 있지 않습니다. 구현에 대한 도움을 받으려면 추가 질문의 근거가 될 것으로 생각됩니다. :-)

+0

PDF 생성기에 영역이 겹쳐 있는지 여부를 묻는 방법은 없습니다. 나는 또한 (OP에서 언급 된) 문서들에 대해 이것을 원하고 line count county는 필자가 원치 않는 타자기 폰트를 사용할 때까지 거기에서 작동하지 않을 것이다. – lmojzis

+1

글쎄 ... TCPDF의 [getNumLines()] (http://www.tcpdf.org/doc/classTCPDF.html#af5cab8beeee29a3ee19a14007e37bd99) 및 [getStringHeight()] (http://www.tcpdf.org/doc/classTCPDF) .html # ad68e86a862fe437a8ac1728cecaaa2e9) 함수는 [MultiCell()] (http://www.tcpdf.org/doc/classTCPDF.html#aa81d4b585de305c054760ec983ed3ece) 텍스트 블록의 크기를 얻는 데 도움이 될 수 있습니다. 텍스트를 처리해야하는 단일 셀이있는 경우 ... [AutoPageBreak()] (http://www.tcpdf.org/doc/classTCPDF.html#a4430365ea0b9015b4aefedad1ba77ea9)를 살펴 보겠습니다. 나는 그것을 사용하지 않았지만 당신이 필요로하는 것일 수 있습니다. – ghoti