2011-07-14 15 views
5

PHP Mam prosty formularz zgłoszeniowy, który po wypełnieniu wysyła do wnioskodawcy wiadomość e-mail z wyceną kursów, które wybrał jako załącznik pdf.wysyłanie załącznika wiadomości e-mail przy użyciu TCPDF

Używam TCPDF i przekazuję dane z formularza do biblioteki przy użyciu zmiennych sesji. Treść jest w formacie html.

Plik PDF jest generowany i wysyłany jako załącznik w razie potrzeby. Problem polega na tym, że jest pusty. Tylko nagłówek i stopka znajdują się w dokumencie. Dzieje się tak szczególnie w Linuksie. W oknach dokument PDF jest generowany zgodnie z oczekiwaniami po pobraniu. Jednak po kliknięciu "Wyświetl" przed pobraniem dokumentu wyświetlany jest tylko nagłówek i stopka.

Oto mój kod. Proszę, pomóżcie. Dziękuję Ci.

<?php 
session_start(); 
require_once('../config/lang/eng.php'); 
require_once('../tcpdf.php'); 

// create new PDF document 
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 

// set document information 
$pdf->SetCreator(PDF_CREATOR); 
$pdf->SetAuthor('Josiah Njuki'); 
$pdf->SetTitle('Quotation Request'); 
$pdf->SetSubject('TCPDF Tutorial'); 
$pdf->SetKeywords('TCPDF, PDF, example, test, guide'); 

// set default header data 
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, '', PDF_HEADER_STRING); 

// set header and footer fonts 
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); 
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); 

// set default monospaced font 
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); 

//set margins 
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); 
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER); 
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER); 

//set auto page breaks 
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); 

//set image scale factor 
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); 

//set some language-dependent strings 
$pdf->setLanguageArray($l); 

// --------------------------------------------------------- 

// set default font subsetting mode 
$pdf->setFontSubsetting(true); 

// Set font 
// dejavusans is a UTF-8 Unicode font, if you only need to 
// print standard ASCII chars, you can use core fonts like 
// helvetica or times to reduce file size. 
$pdf->SetFont('dejavusans', '', 14, '', true); 

// Add a page 
// This method has several options, check the source code documentation for more information. 
$pdf->AddPage(); 

// Set some content to print 
$html = '<span style="font-size:7pt;">' . $_SESSION['content'] . '</span>'; 
$html .= <<<EOD 
EOD; 

// Print text using writeHTMLCell() 
$pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $html, $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=true); 

// --------------------------------------------------------- 

// Close and output PDF document 
// This method has several options, check the source code documentation for more information. 
//$pdf->Output('example_001.pdf', 'I'); 
$doc = $pdf->Output('quotation.pdf', 'S'); 

//define the receiver of the email 
$name = "Name goes here"; 
$email = "[email protected]"; 

$to = "$name <{$_SESSION['email']}>"; 

$from = "John-Smith "; 

$subject = "Here is your attachment"; 

$fileatt = $pdf->Output('quotation.pdf', 'S'); 
//$fileatt = "./test.pdf"; 

$fileatttype = "application/pdf"; 

$fileattname = "newname.pdf"; 

$headers = "From: $from"; 

$file = fopen($fileatt, 'rb'); 

$data = fread($file, filesize($fileatt)); 

fclose($file); 

$semi_rand = md5(time()); 

$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 

$headers .= "\nMIME-Version: 1.0\n" . 
    "Content-Type: multipart/mixed;\n" . 
    " boundary=\"{$mime_boundary}\""; 

$message = "This is a multi-part message in MIME format.\n\n" . 
    "-{$mime_boundary}\n" . 
    "Content-Type: text/plain; charset=\"iso-8859-1\n" . 
    "Content-Transfer-Encoding: 7bit\n\n" . 
    $message .= "\n\n"; 

$data = chunk_split(base64_encode($data)); 

$message .= "–{$mime_boundary}\n" . 
    "Content-Type: {$fileatttype};\n" . 
    " name=\"{$fileattname}\"\n" . 
    "Content-Disposition: attachment;\n" . 
    " filename=\"{$fileattname}\"\n" . 
    "Content-Transfer-Encoding: base64\n\n" . 
    $data . "\n\n" . 
    "-{$mime_boundary}-\n"; 

if (mail($to, $subject, $message, $headers)) { 
    echo "The email was sent."; 
} else { 
    echo "There was an error sending the mail."; 
} 
//============================================================+ 
// END OF FILE 
//============================================================+ 
+0

jesteś pewien, '$ _SESSION [ 'content']' nie jest pusty w momencie generowania php? – k102

Odpowiedz

8

1.you może to zrobić przy użyciu:

$fileatt = $pdf->Output('quotation.pdf', 'E');

opcja E: powrót dokument jako załącznik e-mail base64 mim wieloczęściowe (RFC 2045), znalazłem to info na: tcpdf documentation

potem trzeba tylko zrobić:

$data = chunk_split($fileatt);

i Twój plik jest gotowy do dołączenia do poczty, nie ma potrzeby pracy z plikami. Po prostu zachowaj nagłówki i inne ustawienia, a wykona to zadanie.

lub

2.you można używać F, aby zapisać go na serwerze, a następnie uzyskać dane tak:

$filename = location_on_server."quotation.pdf";

$fileatt = $pdf->Output($filename, 'F');

$data = chunk_split(base64_encode(file_get_contents($filename)));

+4

Nie trzeba używać '$ data = chunk_split ($ fileatt);', ponieważ TCPDF już dzieli dane na porcje. Być może tak nie było w przeszłości. W rzeczywistości, użycie 'chunk_split' na jej wyjściu powoduje teraz problemy. – Sygmoral

+1

Link do dokumentów jest uszkodzony. Oto stały link: http://www.tcpdf.org/doc/code/classTCPDF.html#a3d6dcb62298ec9d42e9125ee2f5b23a1 – techouse

+0

$ filename = 'output.pdf'; $ pdfString = $ pdf-> Dane wyjściowe ($ _ SERVER ['DOCUMENT_ROOT']. '/ path/to/file /'.$ filename, 'S'); $ mail-> AddStringAttachment ($ pdfString, $ filename); To jedyny sposób, w jaki zadziałało dla mnie. – Sol

6
Output($name='yourfilename.pdf', $dest='E') 

E jest rozwiązaniem problemu, który masz. Oto lisst z możliwych wartości ciąg $ dest (docelowy, w którym, aby wysłać dokument):

  • I: wysyłanie inline pliku do przeglądarki (domyślnie).
  • D: wysłać do przeglądarki i wymusić pobranie pliku o nazwie podanej przez nazwę.
  • F: zapisać do pliku serwera lokalnego o nazwie podanej przez nazwę.
  • S: zwraca dokument jako ciąg (nazwa jest ignorowana).
  • FI: równoważna F + i opcji
  • FD: równoważne możliwości C + D, aby
  • E: wraca dokument base64 mim e-maila wieloczęściową (RFC 2045)
1

Ponieważ oficjalnie udokumentowane metody przy użyciu 'S' lub 'E' powrócił null za mną poszedł do przodu i wykorzystał sprawdzony trik bufora wyjściowego, np

protected function PDF_string($pdf, $base64 = false) { 
    ob_start(); 
    $pdf->Output('file.pdf', 'I'); 
    $pdf_data = ob_get_contents(); 
    ob_end_clean(); 

    return ($base64) ? base64_encode($pdf_data) : $pdf_data; 
} 
5

Próbowałem wielu opcji. Ten, który zadziałał, był wtedy, gdy użyłem ustawienia wyjściowego tcpdf "F" do zapisania w folderze. Uwzględniono pliki phpmailer i użyłem poniższego kodu.

$pdf->Output("folder/filename.pdf", "F"); //save the pdf to a folder setting `F` 
require_once('phpmailer/class.phpmailer.php'); //where your phpmailer folder is 
$mail = new PHPMailer();      
$mail->From = "email.com"; 
$mail->FromName = "Your name"; 
$mail->AddAddress("[email protected]"); 
$mail->AddReplyTo("[email protected]", "Your name");    
$mail->AddAttachment("folder/filename.pdf");  
// attach pdf that was saved in a folder 
$mail->Subject = "Email Subject";     
$mail->Body = "Email Body"; 
if(!$mail->Send()) 
{ 
    echo "Message could not be sent. <p>"; 
    echo "Mailer Error: " . $mail->ErrorInfo; 
} 
else 
{ 
    echo "Message sent"; 
} //`the end` 
0

jej o wiele więcej pracy, aby zrobić to po swojemu, ale chciałem dać użytkownikowi możliwość wyjścia D: Wysłane do przeglądarki i wymusić pobieranie pliku o nazwie podanej nazwy lub zapisać go natychmiast jako Plik PDF gotowy do edycji.

Example_054.php.

Następnie utworzyłem identyczny formularz z TCPDF z DOMPDF.

Po przesłaniu formularza formularz wywoła mój skrypt składania, a skrypt wysyłania uzyska dostęp do zapełnionych wartości i zapełni mój identyczny dokument DOMPDF. Następnie zapisuję mój dokument DOMPDF z jego nowymi wartościami polutowanymi. Zapisany plik DOMPDF można teraz przesłać pocztą e-mail za pośrednictwem PHPMailer jako całkowicie wypełniony załącznik do pliku PDF.

Prawdopodobnie był to łatwiejszy sposób przez TCPDF, ale to spełniło moje wymagania doskonale. I nauczyłem się DOMPDF razem z TCPDF w tym samym czasie.

0

Jako uzupełnienie mojego ostatniego posta dotyczy to TYLKO jeśli użytkownik zdecyduje się na dostęp do pliku PDF z przeglądarki, Opcja wyjścia D: Example_054.php. NIE widziałem żadnego innego sposobu wysyłania wiadomości e-mail w postaci pliku PDF utworzonego w przeglądarce i wysyłania go jako załącznika wiadomości e-mail w pliku PDF bez ponownego tworzenia pliku PDF z DOMPDF i zapisywania zapełnionego pliku PDF, aby mógł zostać wysłany jako załącznik wiadomości e-mail. Jeśli użytkownik zdecyduje się zapisać plik PDF przed zapełnieniem, to nie jest to problem, ponieważ w przypadku załącznika będzie istniał wypełniony plik. Jeśli istnieje łatwiejszy sposób na obsłużenie tego scenariusza, proszę dać mi znać!

+2

Ben, połącz oba, chyba że są to naprawdę różne odpowiedzi. Po prostu kliknij link edycji pod odpowiedzią i edytuj go. I usuń drugą odpowiedź – Drew

+0

@Ben musisz utworzyć link href dla przykładów (link Przykładowy plik 0505.php) do swojej odpowiedzi –

0

Istnieje kod z tcpdf.php. widzimy, co robi opcja E w funkcji Output. używa on base64_encode & chunk_split, a także dodaje do niego headers, więc nie ma potrzeby ponownego dodawania nagłówków.

case 'E': { 
      // return PDF as base64 mime multi-part email attachment (RFC 2045) 
      $retval = 'Content-Type: application/pdf;'."\r\n"; 
      $retval .= ' name="'.$name.'"'."\r\n"; 
      $retval .= 'Content-Transfer-Encoding: base64'."\r\n"; 
      $retval .= 'Content-Disposition: attachment;'."\r\n"; 
      $retval .= ' filename="'.$name.'"'."\r\n\r\n"; 
      $retval .= chunk_split(base64_encode($this->getBuffer()), 76, "\r\n"); 
      return $retval; 
     } 

Tak więc w powyższym pytaniu

$attachFile = $pdf->Output('quotation.pdf', 'E'); 
$html_message = '<p> Your HTML/ Plain message Here </p>' ; 
$uid = md5() ; 

$header = "From: <[email protected]>\r\n"; 
$header .= "Reply-to: <[email protected]>\r\n"; 
$header .= "MIME-Version: 1.0\r\n"; 
$header .= "Content-type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n"; 

// message & attachment 
$nmessage = "--".$uid."\r\n"; 
$nmessage .= "Content-type:text/html ;charset=UTF-8\r\n"; 
$nmessage .= $html_message."\r\n\r\n"; //Your message 

$nmessage .= "--".$uid."\r\n"; 
$nmessage .= $attachFile."\r\n\r\n"; //adding Your PDF file 
$nmessage .= "--".$uid."--" ; 
Powiązane problemy