创建PDF并通过电子邮件发送

时间:2011-05-06 08:22:20

标签: php pdf-generation

我正在考虑用户是否可以将某些信息输入表单并通过mail()发送。

我希望将详细信息作为PDF附件发送。可能是发件人的姓名和日期/时间。 test_user_06052011.pdf

我有一个PDF设计,但我不确定如何将这个设计集成到用PHP创建PDf。

有没有人有我可以做到的例子或方法?

7 个答案:

答案 0 :(得分:4)

创建PDF服务器站点的非常简单的方法是使用wkhtmltopdf。但是,您需要对服务器进行shell访问才能进行设置。

要创建PDF,您需要两个文件:一个是PHP,它生成您想要转换为PDF的HTML。我们说这是invoice.php:

<?php
    $id = (int) $_GET['id'];
?>
<h1>This is invoice <?= $id ?></h1>
<p>some content...</p>

另一个,它将获取发票并使用wkhtmltopdf将其转换为PDF:

<?php

$tempPDF = tempnam( '/tmp', 'generated-invoice' );
$url = 'http://yoursite.xx/invoice.php?id=123';

exec( "wkhtmltopdf  $url  $tempPDF" );

header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename=invoice.pdf');

echo file_get_contents( $tempPDF );
unlink( $tempPDF );

创建PDF文件后,您还可以通过以下方式发送带附件的邮件:

<?php

$to = "abc@gmail.com";
$subject = "mail with attachment";

$att = file_get_contents( 'generated.pdf' );
$att = base64_encode( $att );
$att = chunk_split( $att );

$BOUNDARY="anystring";

$headers =<<<END
From: Your Name <abc@gmail.com>
Content-Type: multipart/mixed; boundary=$BOUNDARY
END;

$body =<<<END
--$BOUNDARY
Content-Type: text/plain

See attached file!

--$BOUNDARY
Content-Type: application/pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="your-file.pdf"

$att
--$BOUNDARY--
END;

mail( $to, $subject, $body, $headers );

答案 1 :(得分:3)

如果您使用Acrobat制作了可填写的PDF,这里有一大堆代码可以帮助您入门。此代码需要最新版本的phpmailer才能工作,所以只需下载并将其放在您放入此代码的同一目录中的类文件夹中。将您的pdf表单提交到包含此代码的页面。

/*  Branden Sueper 2012
//  PDF to Email - PHP 5
//  Includes: PHPMailer 5.2.1
*/
<?php
if(!isset($HTTP_RAW_POST_DATA)) {
    echo "The Application could not be sent. Please save the PDF and email it manually.";
    exit;
}
echo "<html><head></head><body><img src='loading.gif'>";

//Create PDF file with data
$semi_rand = md5(time());
$pdf = $HTTP_RAW_POST_DATA;

 $file = $semi_rand . ".pdf"; 
 $handle = fopen($file, 'w+');
 fwrite($handle, $pdf);   
 fclose($handle);
//

require_once('class/class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail = new PHPMailer(false); // the true param means it will throw exceptions on errors, which we need to catch

$mail->IsSMTP(); // telling the class to use SMTP

try {
  $mail->Host       = "mail.xxxxxxx.com"; // SMTP server
  $mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
  $mail->SMTPAuth   = true;                  // enable SMTP authentication
  $mail->SMTPSecure = "ssl";                 // sets the prefix to the servier
  $mail->Host       = "smtp.gmail.com";      // sets GMAIL as the SMTP server
  $mail->Port       = 465;                   // set the SMTP port for the GMAIL server
  $mail->Username   = "xxxxxxx@xxxxxxx.com"; // GMAIL username
  $mail->Password   = "xxxxxxxx";            // GMAIL password
  $mail->AddAddress('Recipient@xxxxxxx.com', 'First Last');
  $mail->SetFrom('reply-to-address@xxxxxxx.com', 'First Last');
  $mail->Subject = 'Your Subject';
  $mail->Body = 'Hello!';
  $mail->AddAttachment($file); // attachment
  $mail->Send();

  //Delete the temp pdf file then redirect to the success page
  unlink($file);
  echo '<META HTTP-EQUIV="Refresh" Content="0; URL="success.php">';    
  exit;    
} catch (phpmailerException $e) {
  //you can either report the errors here or redirect them to an error page
  //using the above META tag
  echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Boring error messages from anything else!
}
  //Verify the temporary pdf file got deleted
  unlink($file);
?>

PHPMailer只需下载PHP邮件程序并根据自己的喜好调整上述代码即可。有关如何创建可填写PDF的更多信息,请转至http://www.adobe.com/products/acrobatpro/create-fillable-pdf-forms.html

祝你好运!我记得花了3天时间试图找出一个非常相似的问题!

答案 2 :(得分:3)

以下是完整的代码http://codexhelp.blogspot.in/2017/04/php-email-create-pdf-and-send-with.html

    /**/
    $mailto = $_POST['mailto'];
    $mailfrom = $_POST['mailfrom'];
    $mailsubject = $_POST['mailsubject'];
    $firstname = $_POST['firstname'];
    $lastname = $_POST['lastname'];
    $description = $_POST['description'];


    $description = wordwrap($description, 100, "<br />");
    /* break description content every after 100 character. */


    $content = '';

    $content .= '
<style>
table {
border-collapse: collapse;
}

 table{
 width:800px;
 margin:0 auto;
}

 td{
border: 1px solid #e2e2e2;
padding: 10px; 
max-width:520px;
word-wrap: break-word;
}


 </style>

 ';
    /* you css */



    $content .= '<table>';

    $content .= '<tr><td>Mail To</td> <td>' . $mailto . '</td> </tr>';
    $content .= '<tr><td>Mail From</td>   <td>' . $mailfrom . '</td> </tr>';
    $content .= '<tr><td>Mail Subject</td>   <td>' . $mailsubject . '</td> </tr>';
    $content .= '<tr><td>Firstname</td>   <td>' . $firstname . '</td> </tr>';
    $content .= '<tr><td>Lastname</td>   <td>' . $lastname . '</td> </tr>';
    $content .= '<tr><td>Description</td>   <td>' . $description . '</td> </tr>';

    $content .= '</table>';


    require_once('html2pdf/html2pdf.class.php');


    $to = $mailto;
    $from = $mailfrom;
    $subject = $mailsubject;  

    $html2pdf = new HTML2PDF('P', 'A4', 'fr');

    $html2pdf->setDefaultFont('Arial');
    $html2pdf->writeHTML($content, isset($_GET['vuehtml']));

    $html2pdf = new HTML2PDF('P', 'A4', 'fr');
    $html2pdf->WriteHTML($content);


    $message = "<p>Please see the attachment.</p>";
    $separator = md5(time());
    $eol = PHP_EOL;
    $filename = "pdf-document.pdf";
    $pdfdoc = $html2pdf->Output('', 'S');
    $attachment = chunk_split(base64_encode($pdfdoc));




    $headers = "From: " . $from . $eol;
    $headers .= "MIME-Version: 1.0" . $eol;
    $headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol . $eol;

    $body = '';

    $body .= "Content-Transfer-Encoding: 7bit" . $eol;
    $body .= "This is a MIME encoded message." . $eol; //had one more .$eol


    $body .= "--" . $separator . $eol;
    $body .= "Content-Type: text/html; charset=\"iso-8859-1\"" . $eol;
    $body .= "Content-Transfer-Encoding: 8bit" . $eol . $eol;
    $body .= $message . $eol;


    $body .= "--" . $separator . $eol;
    $body .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"" . $eol;
    $body .= "Content-Transfer-Encoding: base64" . $eol;
    $body .= "Content-Disposition: attachment" . $eol . $eol;
    $body .= $attachment . $eol;
    $body .= "--" . $separator . "--";

    if (mail($to, $subject, $body, $headers)) {

        $msgsuccess = 'Mail Send Successfully';
    } else {

        $msgerror = 'Main not send';
    }

答案 3 :(得分:2)

今天无法找到使用原生mail()功能的原因。在大多数微不足道的情况下,我们可以使用PHPMailer库,它在OOP风格中为我们提供了发送电子邮件的机会,即使不了解标题。 甚至而不保存物理文件的解决方案是

$mail = new PHPMailer();
...
$doc = $pdf->Output('S');
$mail->AddStringAttachment($doc, 'doc.pdf', 'base64', 'application/pdf');
$mail->Send();

答案 4 :(得分:1)

了解FPDF - http://www.fpdf.org/ - 它是免费的,是生成PDF的好工具

有一个由PHP推荐的PDF生成器,但它非常昂贵,而且现在这个名字不在我身边,但是我已经多次使用FPDF了。

答案 5 :(得分:1)

根据您的要求,您还可以查看TCPDF,我大量使用它来动态创建PDF ...它内置了(有限的)HTML到PDF功能很容易使用(只看实例)。另一个主要好处是:它仍处于积极发展阶段(有些人可能过于活跃:p)。

答案 6 :(得分:0)

旧问题但仍然相关,因此将其发布在这里以供新访问者使用。

PDFMark 提供了一个 API 来生成 PDF,也可以通过电子邮件发送它。您可以从 HTML 创建 PDF 并指定电子邮件地址,生成的 PDF 将作为附件发送到该地址。

披露:我是开发者