php 创建 PDF 并通过电子邮件发送
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5908706/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Creating a PDF and sending by email
提问by sipher_z
I am looking at the ablity for users to enter some information into a form and send it via mail()
.
我正在研究用户在表单中输入一些信息并通过mail()
.
What I'd like is for the details to be sent as a PDF attachment. Possibly with the name of the the sender and a date/time. test_user_06052011.pdf
我想要的是将详细信息作为 PDF 附件发送。可能带有发件人的姓名和日期/时间。test_user_06052011.pdf
I have a design for the PDF, but I'm not sure how I'd integrate this design to create a PDf in PHP.
我有一个 PDF 设计,但我不确定如何集成这个设计以在 PHP 中创建 PDf。
Does anyone have an examples or ways in which I could do this?
有没有人有我可以做到这一点的例子或方法?
采纳答案by LiamB
Have a look into FPDF - http://www.fpdf.org/- It's free and a great tool for generating PDF's
看看 FPDF - http://www.fpdf.org/- 它是免费的,是生成 PDF 的好工具
There is a PDF generator which is recomended by PHP, however it'd very expensive and the name elludes me now, however I've used FPDF several times whith great success.
PHP 推荐了一个 PDF 生成器,但是它非常昂贵,而且现在我不知道这个名字,但是我已经多次使用 FPDF 并取得了巨大的成功。
回答by mateusza
Very easy way to create PDF server-site is using wkhtmltopdf. However, you will need a shell access to server to set it up.
创建 PDF 服务器站点的非常简单的方法是使用wkhtmltopdf。但是,您需要对服务器进行 shell 访问才能进行设置。
To create PDF you need two files: one is PHP which generates HTML you want to convert into PDF. Let's say this is invoice.php:
要创建 PDF,您需要两个文件:一个是 PHP,它生成要转换为 PDF 的 HTML。假设这是invoice.php:
<?php
$id = (int) $_GET['id'];
?>
<h1>This is invoice <?= $id ?></h1>
<p>some content...</p>
And the other one, which will fetch the invoice and convert it into PDF using wkhtmltopdf:
另一个,它将获取发票并使用 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 );
Once you have created a PDF file you can also send mail with attachment this way:
创建 PDF 文件后,您还可以通过以下方式发送带有附件的邮件:
<?php
$to = "[email protected]";
$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 <[email protected]>
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 );
回答by Branden S. Smith
If you made a Fillable PDF with Acrobat, here is a good chunk of code that will help you get started. This code requires the newest version of phpmailer to work, so just download that and put it in a class folder in the same directory you put this code in. Have your pdf form submit to a page with this code.
如果您使用 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 = "[email protected]"; // GMAIL username
$mail->Password = "xxxxxxxx"; // GMAIL password
$mail->AddAddress('[email protected]', 'First Last');
$mail->SetFrom('[email protected]', '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);
?>
PHPMailerJust download PHP mailer and adjust the above code to your liking. For more info on how to create a fillable PDF go to http://www.adobe.com/products/acrobatpro/create-fillable-pdf-forms.html
PHPMailer只需下载 PHP mailer 并根据您的喜好调整上述代码。有关如何创建可填写 PDF 的更多信息,请访问http://www.adobe.com/products/acrobatpro/create-fillable-pdf-forms.html
Good Luck! I remember spending 3+ days trying to figure out a very similar issue!
祝你好运!我记得花了 3 天多的时间试图找出一个非常相似的问题!
回答by Paul Burilichev
Can't find reason for using native mail()
function today. In mostly trivial situations we can use PHPMailer library, which in OOP style gives us opportunity to send emails even without understanding of header.
The solution even without saving physical fileis
mail()
今天找不到使用本机功能的原因。在大多数微不足道的情况下,我们可以使用 PHPMailer 库,它在 OOP 风格中使我们有机会即使不了解标题也能发送电子邮件。即使不保存物理文件的解决方案是
$mail = new PHPMailer();
...
$doc = $pdf->Output('S');
$mail->AddStringAttachment($doc, 'doc.pdf', 'base64', 'application/pdf');
$mail->Send();
回答by manoj
Here is a complete code http://codexhelp.blogspot.in/2017/04/php-email-create-pdf-and-send-with.html
这是完整的代码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';
}
回答by wimvds
Depending on your requirements, you could also have a look at TCPDF, I use it a lot to create PDFs on the fly from PHP... It has (limited) HTML to PDF functionality built-in and is very easy to use (just look at the examples). And another major benefit : it's still in active development (a bit too active for some probably :p).
根据您的要求,您还可以查看TCPDF,我经常使用它来从 PHP 创建 PDF ……它具有(有限的)内置 HTML 到 PDF 功能,并且非常易于使用(只是看例子)。另一个主要好处:它仍在积极开发中(对于某些人来说可能有点过于活跃:p)。