2011-12-01 4 views
4

TCPDF를 사용하여 보고서 생성 솔루션을 구현하는 중입니다. 일부 보고서는 크기가 작고 (2-3 페이지), 한 번에 많은 보고서를 선택하고 모두 요청할 수 있습니다.TCPDF를 사용하여 큰 PDF를 만드는 가장 효율적인 방법은 무엇입니까?

현재 각 보고서가 새 페이지에서 시작하고 페이지 그룹화를 사용하여 각 보고서에 페이지 번호가 다시 시작되도록 모든 보고서를 포함하는 단일 PDF를 생성합니다. 작동하면 좋지만 너무 많은 보고서를 선택하면 코드가 사라져서 빈 PDF로 끝납니다.

업데이트 : 단일 PDF를 만드는 것은 클라이언트의 요구 사항입니다. 그들은 많은 PDF 보고서를 선택했을 때 단일 PDF 내의 보고서를 쉽게 전환 할 수있는 PDF 목차를 원합니다.

내 질문은 :

  1. 빈 PDF와 종료하지 않고이 PDF를 생성하는 가장 효율적인 방법은 무엇입니까? TCPDF가 처리 할 수있는 크기에 제한이 있는지 찾을 수 없습니다.

  2. PHP에서 ob_start()를 사용해야합니까, 아니면 큰 문자열을 작성해야합니까?

  3. 내 보고서는 원래 HTML이므로 TCPDF를 보냈습니다. 그러나 다른 방법을 사용하여 정보 (예 : 셀, 다중 셀 등)를 사용하면 TCPDF의 성능이 향상 될까요?

다음은 PDF를 출력하는 코드입니다. 은 $ PDF 객체는 예 라이브러리에 포함 된 관련 TCPDF에 따라 설정 :

foreach ($students_info as $student_info) { 
    $info = $student_info->fetch_object(); // get query result object 

    // put in the student information 
    $pdf->set_student_info($info->lastName, $info->firstName, $info->rank, $info->idNum); 

    $pdf->startPageGroup(); // start a page group to handle paging for multiple students 
    $pdf->AddPage();  // add a page 

    $html = "<style>"; 
    $html .= file_get_contents(/*some style sheet*/); 
    $html .= file_get_contents(/*some other style sheet*/); 
    $html .= "</style>"; 

    $html .= start_report_div($i); 
    $html .= '<table class="report_table">'.      
      '<tbody>'. 
      '<tr><td>'; 
    $html .= display_report_title($report); 
    $html .= display_student_info($db, $info); 
    $html .= display_academic_comments_body($db, $info->studentID, $info->sessionID); 
    $html .= display_signature_block($report); 
    $html .= '</td></tr>'. 
      '</tbody>'.      
      '</table>'; 
    $html .= end_report_div(); 

    $pdf->writeHTML($html, // the content 
      true,    // put a newline after text 
      false,    // paint background, false = transparent 
      true,    // reset last cell height 
      false,    // add left padding 
      ''     // align 
    ); 
    $html = '';  // reset for next student 
    $pdf->lastPage(); // pointer to last page in case we are doing more than one student 
} 
+0

많은 작은 보고서를 생성하고 사용자가 모든 PDF 파일을 포함하는 다운로드 용 ZIP 파일을 생성합니다. –

+0

유효한 아이디어이지만 클라이언트가 원하는 것은 아닙니다. 보고서에서 PDF로 목차가있는 보고서를 원할 경우 리포트에서 보고서로 쉽게 전환 할 수 있습니다 (학생 정보에서 학생 정보까지). –

+0

왜 downvote? 내가 코멘트없이 downvote 싫어. –

답변

3

대답 질문 1 :

음, 이것은 PHP 내 경험 부족으로 인한 또 다른 하나입니다. 빈 PDF는 PHP의 기본 max_execution_time이 30 초로 설정된 결과입니다. ini_set을 사용하여 PDF 생성 스크립트의 값을 300으로 설정하고 보고서가 전체적으로 생성되었습니다.

16 페이지 PDF의 경우 생성하는 데 1 분 30 초가 걸렸습니다. TCPDF 경험이 많은 사람이라면 오래 걸릴 것 같습니까?

답변 질문 3 :

나는 몇 번의 실험을 수행하고, PDF를 생성하기 위해 TCPDF에서 직접 PDF 기능을 사용하여 한

가 TCPDF에 HTML과 CSS를 통과 한 후 PDF를 생성하는 것보다 확실히 빠르다. 의미가 있지만 실제 성능 차이를 확인하는 것이 좋습니다. 따라서 PDF 호출을위한 레이아웃을 만드는 것이 지루할지라도, 큰 PDF가 있다면 성능 이득이 그럴 가치가 있습니다.

질문 2 : 난 아직도위한 ob_start의 사용에 관한 경험이 많은 PHP 사용자의 입력을 부탁드립니다

.

+0

@ Question 2 : ob_start()를 전혀 사용할 필요가 없습니다. 단일 요청으로 생성 된 PDF 파일을 다운로드하려는 경우 이진 스트림 (헤더)이 손상되지 않도록 방지하는 것입니다. PDF를 생성하는 동안 실수로 일부 공백을 놓친 경우 "헤더를 수정할 수 없습니다. 이미 출력이 시작되었습니다."를 다운로드하려고 할 때 오류가 발생할 수 있습니다. ob_start() .. ob_get_clean()은 원치 않는 출력을 버리고 적절하게 설정된 헤더를 사용하는 데 유용합니다. PDF 생성을 시작하기 전에 ob_start()를 시작하고 PDF 파일을 다운로드하기 직전에 ob_get_clean()을 시작할 수 있습니다. – lubosdz

4

큰 파일과 TCPDF에도 문제가있었습니다. 나는 TCPDF에서 mPDF로 전환했다. 이 프로젝트는 FPDF와 HTML2PDF를 기반으로하며 HTML 구문 분석을 사용하면 훨씬 빠릅니다.

TCPDF는 약 70 초에서 80 초 사이의 기사 - 세부 개요 (사진, 링크 및 일부 자료가 포함 된 150 페이지)를 가져갔습니다.

동일한 HTML 코드와 동일한 PHP 스크립트가 방금 mPDF 클래스로 바뀌었고 함수는 동일한 PDF를 만들기 위해 불과 6 초에서 8 초 밖에 걸리지 않았습니다.

+0

이 정보는 유용합니다. 감사합니다. –

관련 문제