2016-04-20 56 views
1

我正在寻找一个最初的PDF文件,一个有图形和文本,然后采取一些HTML代码,其中有一些用户输入的动态值,生成一个PDF格式,希望或者使用最初的PDF作为背景,或者以某种方式运行PHP脚本,然后将两个PDF作为另一个背景的“合并”。如何在现有PDF上叠加HTML生成的PDF?

我有一些代码,生成一个HTML格式的PDF:(使用DOMPDF)

$initialpdf = file_get_contents('file_html.html'); 

$initialpdf = str_replace(array(
     '%replaceText1%', 
     '%replaceText2%' 
    ), array (
     $replaceText1, 
     $replaceText2, 
    ), $initialpdf); 

$fp = fopen('file_html_new.html','w'); 
file_put_contents('file_html_new.html', $initialpdf); 

require_once("dompdf/dompdf_config.inc.php"); 
spl_autoload_register('DOMPDF_autoload'); 
function pdf_create($html, $filename, $paper, $orientation, $stream=TRUE) 
{ 
    $dompdf = new DOMPDF(); 
    $dompdf->set_paper($paper,$orientation); 
    $dompdf->load_html($html); 
    $dompdf->render(); 
    $pdf = $dompdf->output(); 
    @file_put_contents($filename . ".pdf", $pdf); 
} 
$filename = 'HTML_Generated_pdf'; 
$dompdf = new DOMPDF(); 
$html = file_get_contents('file_html_new.html'); 
pdf_create($html,$filename,'Letter','landscape'); 

上面的代码需要的HTML文件“file_html.html”并执行串替换与用户输入的值,呈现此作为新的名为“file_html_new.html”的HTML文件,然后将其呈现为PDF。

我也有其他的PHP代码由具有PDF作为初始源呈现一个PDF:(使用FPDF)

<?php 
ob_clean(); 
ini_set("session.auto_start", 0); 
define('FPDF_FONTPATH','font/'); 
define('FPDI_FONTPATH','font/'); 
require('fpdf.php'); 
require('fpdi.php'); 

$pdf = new FPDI(); 
$pdf->setSourceFile("/home/user/public_html/wp-content/myPDF.pdf"); 
$tplIdx = $pdf->importPage(1); 
$specs = $pdf->getTemplateSize($tplIdx); 
$pdf->addPage($specs['h'] > $specs['w'] ? 'P' : 'L', 'Letter'); 
$pdf->useTemplate($tplIdx, 0, 0); 

$pdf->SetFont('helvetica'); 
$pdf->SetXY(30, 30); 
$pdf->Write(0, $replaceText1); 
ob_end_clean(); 
$pdf->Output('New_Generated_PDF.pdf', 'F'); 
?> 

这需要一个已经存在的PDF,“myPDF.pdf”,并使用它作为背景,写一些有价值的文件,并保存新生成的文件。

虽然这基本上是我想要做的,但我需要使用html,因为文本的确切格式变得严格,几乎不可能通过手动绘制文本来完成。

我打算使用DOMPDF,FPDF,FPDI,TCPDF或任何其他PHP资源来完成此操作。

有没有办法融合上述两种方式?

+0

我推荐一个基于会话的文件名。当用户提交表单时,他/她在服务器上创建一个PDF文件。文件名将是用户会话。使用[scandir()](php.net/manual/en/function.scandir.php)或file_exists()检查该特定用户是否有任何PDF,并显示所有的pdf文件;如果具有该用户会话的文件存在,请使用另一个提交按钮将文件名转换为第二个代码。 –

+0

@MawiaHL这不是我的问题的根源,它已经保存为基于会话的文件名,并带有动态文件名加载项。问题是在另一个PDF上渲染一个PDF。意思是1页+ 1页= 1页的方式,而不是单个渲染。 – NoReceipt4Panda

回答

2

当然,您也可以在FPDI中使用不同的现有PDF文档。这段代码应该向你展示这个概念(实际上我猜所有的页面格式都是A4文件):

<?php 

$pdf = new FPDI(); 

// let's get an id for the background template 
$pdf->setSourceFile('myPDF.pdf'); 
$backId = $pdf->importPage(1); 

// iterate over all pages of HTML_Generated_pdf.pdf and import them 
$pageCount = $pdf->setSourceFile('HTML_Generated_pdf.pdf'); 
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) { 
    // add a page 
    $pdf->AddPage(); 
    // add the background 
    $pdf->useTemplate($backId); 
    // import the content page 
    $pageId = $pdf->importPage($pageNo); 
    // add it 
    $pdf->useTemplate($pageId); 
} 

$pdf->Output(); 
+0

这不会使2页PDF格式正确吗?我正在寻找它是一个页面pdf,其中两个页面相互重叠。 – NoReceipt4Panda

+0

您是否阅读了代码?如果HTML_Generated_pdf.pdf只有一个页面,则会导致1页... myPDF.pdf的第1页将用作所有页面的背景。逻辑是非常微不足道的,我不需要进一步的解释...试试看怎么样? –

+0

我刚试过并将其格式化为我的代码。你是完全正确的,它的工作!我不得不自己写几行,但它完全可操作!现在萌芽你的真棒回答芽! – NoReceipt4Panda