2011-07-14 131 views
5

PHP Tengo un formulario de solicitud de curso simple, que cuando se completa, se envía un correo electrónico al solicitante con una cotización de honorarios para los cursos seleccionados como archivo adjunto en pdf.enviando un archivo adjunto de correo electrónico usando TCPDF

Estoy usando TCPDF y estoy pasando los datos del formulario a la biblioteca usando variables de sesión. El contenido está en formato html.

El PDF se genera y se envía como un archivo adjunto, según sea necesario, el problema es que está en blanco ... solo el encabezado y el pie de página están en el documento. Esto es particularmente así en Linux. En Windows, el documento pdf se genera como se esperaba cuando se descarga. Sin embargo, cuando hace clic en "ver" antes de descargar el documento, solo se muestran el encabezado y el pie de página.

Aquí está mi código. Por favor, alguien ayuda. Gracias.

<?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

son '¿Seguro $ _SESSION [ 'contenido']' no está vacío en el momento de la generación de php? – k102

Respuesta

8

1.you puede hacer eso usando:

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

la opción E: devolver el documento como archivo adjunto de correo electrónico MIME base64 de varias partes (RFC 2045), he encontrado esta información en: tcpdf documentation

después de que sólo tiene que hacer:

$data = chunk_split($fileatt);

y su archivo está listo para adjuntarse al correo, no es necesario trabajar con archivos. Simplemente mantenga sus encabezados y otras configuraciones y hará el trabajo.

o

2.you puede utilizar F para guardarlo en su servidor, a continuación, obtener los datos de la siguiente manera:

$filename = location_on_server."quotation.pdf";

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

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

+4

No hay necesidad de '$ data = chunk_split ($ fileatt);', ya que TCPDF ya divide los datos en fragmentos. Quizás este no fue el caso en el pasado. De hecho, usar 'chunk_split' en su salida ahora estropea las cosas. – Sygmoral

+1

El enlace a los documentos está roto. Aquí está el enlace fijo: http://www.tcpdf.org/doc/code/classTCPDF.html#a3d6dcb62298ec9d42e9125ee2f5b23a1 – techouse

+0

$ filename = 'output.pdf'; $ pdfString = $ pdf-> Salida ($ _ SERVER ['DOCUMENT_ROOT']. '/ path/to/file /'.$ filename, 'S'); $ mail-> AddStringAttachment ($ pdfString, $ filename); Esta es la única forma en que me ha funcionado. – Sol

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

E es la solución para el problema que tienes. Aquí está una lisst de los valores posibles de la cadena $ dest (Destino dónde enviar el documento):

  • I: enviar el archivo en línea con el navegador (por defecto).
  • D: enviar al explorador y forzar la descarga de un archivo con el nombre indicado.
  • F: guardar en un archivo de servidor local con el nombre dado por nombre.
  • S: devuelva el documento como una cadena (se ignora el nombre).
  • FI: equivalente a F opción + I
  • FD: equivalente opción F + D a
  • E: devolver el documento como MIME base64 adjunto de correo electrónico de varias partes (RFC 2045)
1

Desde el método que utiliza 'S' o 'E' regresaron null para mí que siguió adelante documentado oficialmente y se utiliza el truco de probada eficacia búfer de salida, por ejemplo:

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

He intentado muchas opciones. El que funcionó fue cuando utilicé la configuración de salida tcpdf "F" para guardar en una carpeta. Incluyó los archivos phpmailer y usó el código a continuación.

$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

Es mucho más trabajo que hacer a mi manera, pero yo quería dar al usuario la opción de salida D: enviar al navegador y forzar la descarga del archivo con el nombre dado por su nombre o guardarlo inmediatamente como una Archivo PDF listo para editar.

Example_054.php.

Luego creé una forma idéntica de TCPDF con DOMPDF.

Una vez que se envía el formulario, el formulario llamará a mi script de envío y el script de envío accederá a los valores poblados y a su vez rellenará mi documento DOMPDF idéntico. Luego guardo mi documento DOMPDF con sus nuevos valores polulados. El archivo DOMPDF guardado ahora se puede enviar por correo electrónico a través de PHPMailer como archivo adjunto de un archivo PDF completamente lleno.

Probablemente haya una manera más fácil de hacerlo a través de TCPDF, pero esto satisfizo mis requisitos perfectamente. Y tengo que aprender DOMPDF junto con TCPDF al mismo tiempo.

0

Como una enmienda a mi última publicación, esto ÚNICAMENTE se aplica si el usuario elige acceder al archivo PDF desde el navegador, Opción de salida D: Ejemplo_054.php. NO vi otra forma de enviar un correo electrónico como PDF creado en el navegador y enviarlo como el archivo adjunto del archivo PDF real sin volver a crear el PDF con DOMPDF y guardar el PDF rellenado para poder enviarlo como el archivo adjunto. Si el usuario elige guardar el PDF antes de rellenarlo, entonces esto no es un problema ya que el archivo poblado existirá para el archivo adjunto. Si hay una forma más fácil de manejar este escenario, ¡házmelo saber!

+2

Ben, combina los dos, a menos que sean respuestas realmente diferentes. Simplemente haga clic en el enlace editar debajo de la Respuesta y edítela. Y elimine la segunda respuesta – Drew

+0

@Ben, necesita hacer un enlace href para ejemplos (enlace archivo Example_054.php) en su respuesta –

0

Hay un código de tcpdf.php. podemos ver que lo que hace la opción E en la función Output. usa base64_encode & chunk_split y también agrega headers con él así que no hay necesidad de agregar encabezados otra vez.

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; 
     } 

Así que en la pregunta anterior

$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."--" ; 
Cuestiones relacionadas