10

我是 PHP 新手,在插入多个页面时使用 FPDI 有点困难。

我有一个由 3 页组成的 .pdf 文件。我最终将第 1 页保存为 3 页中的单独页面,并且可以与我的代码一起使用,但那是因为我的代码仅适用于 1 页。当我将它改回 3 页文件时,它给了我一个内部服务器错误。

这是我正在使用的代码:

<?php

require_once('prog/fpdf.php');
require_once('prog/fpdi.php');

// initiate FPDI
$pdf = new FPDI();

// add a page
$pdf->AddPage();

// set the source file
$pdf->setSourceFile("apps/Par.pdf");

// import page 1
$tplIdx = $pdf->importPage(1);

// use the imported page and place it at point 10,10 with a width of 100 mm
$pdf->useTemplate($tplIdx, null, null, 0, 0, true);

// font and color selection
$pdf->SetFont('Helvetica');
$pdf->SetTextColor(200, 0, 0);

// now write some text above the imported page
$pdf->SetXY(40, 83);
$pdf->Write(2, 'THIS IS JUST A TEST');


$pdf->Output();

我不知道如何把这段代码变成能够看到所有 3 页的能力。请帮助我。

4

6 回答 6

24

setSourceFile()方法将返回您设置的文档的页数。只需循环浏览这些页面并逐页导入它们。您所有页面的示例如下所示:

<?php
require_once('prog/fpdf.php');
require_once('prog/fpdi.php');

// initiate FPDI
$pdf = new FPDI();

// set the source file
$pageCount = $pdf->setSourceFile("apps/Par.pdf");

for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
    $tplIdx = $pdf->importPage($pageNo);

    // add a page
    $pdf->AddPage();
    $pdf->useTemplate($tplIdx, null, null, 0, 0, true);

    // font and color selection
    $pdf->SetFont('Helvetica');
    $pdf->SetTextColor(200, 0, 0);

    // now write some text above the imported page
    $pdf->SetXY(40, 83);
    $pdf->Write(2, 'THIS IS JUST A TEST');
}

$pdf->Output();

关于“内部服务器”,您应该启用错误报告:

error_reporting(E_ALL);
ini_set('display_errors', 1);

...或者只是检查您的 php 错误日志以获取详细信息。

于 2014-09-18T13:26:50.017 回答
6

这个对我有用:

<?php

require_once('fpdf/fpdf.php');
require_once('fpdi/src/autoload.php');

use \setasign\Fpdi\Fpdi;

$pdf = new FPDI();
// get the page count
$pageCount = $pdf->setSourceFile('pdf_file.pdf');
// iterate through all pages
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
    // import a page
    $templateId = $pdf->importPage($pageNo);
    // get the size of the imported page
    $size = $pdf->getTemplateSize($templateId);

    // create a page (landscape or portrait depending on the imported page size)
    if ($size[0] > $size[1]) {
        $pdf->AddPage('L', array($size[0], $size[1]));
    } else {
        $pdf->AddPage('P', array($size[0], $size[1]));
    }

    // use the imported page
    $pdf->useTemplate($templateId);

    $pdf->SetFont('Helvetica');
    $pdf->SetXY(5, 5);
    $pdf->Write(8, 'A complete document imported with FPDI');
}

$pdf->Output();

更改数组($size['w'], $size['h']) 为数组($size[0], $size[1])

于 2019-02-23T20:54:34.713 回答
4
<?php
require_once('fpdf/fpdf.php');
require_once('fpdi/fpdi.php');

// initiate FPDI
$pdf = new FPDI();

// get the page count
$pageCount = $pdf->setSourceFile('Laboratory-Report.pdf');
// iterate through all pages
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
// import a page
$templateId = $pdf->importPage($pageNo);
// get the size of the imported page
$size = $pdf->getTemplateSize($templateId);

// create a page (landscape or portrait depending on the imported page size)
if ($size['w'] > $size['h']) {
    $pdf->AddPage('L', array($size['w'], $size['h']));
} else {
    $pdf->AddPage('P', array($size['w'], $size['h']));
}

// use the imported page
$pdf->useTemplate($templateId);

$pdf->SetFont('Helvetica');
$pdf->SetXY(5, 5);
$pdf->Write(8, 'A complete document imported with FPDI');
}

// Output the new PDF
$pdf->Output();    
于 2018-03-24T10:54:19.727 回答
0

这对我来说非常有效。Laravel 实现。这只会写在你想要的页面上,而不是每一页

use setasign\Fpdf\Tpdf\Fpdf;
use setasign\Fpdi\Fpdi;

class SignDocumentsController extends Controller
{
    public function signPDF(Request $data)
    {
        
        $pdf = new Fpdi();
        
        $pageCount = $pdf->setSourceFile($data["sourceFile"]);
        
        for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
            $tplIdx = $pdf->importPage($pageNo);
            $pdf->AddPage();
            $pdf->useTemplate($tplIdx, 5, 5, 205);

            $pdf->SetFont('Times');
            $pdf->SetTextColor(0, 0, 0);
            
            if($pageNo==$data["pageNumber"]){
                $pdf->Image($data["signitureImg"],$data["x"],$data["y"],$data["w"],$data["h"],$data["pictureType"]);
                $x = $data["x"]+1;
                $y = $data["y"]+$data["h"]+1;
                $pdf->SetXY($x,$y);
                $pdf->Write(0, date("Y-m-d H:i:s"));
            }
            $filename=$data["outputFile"];
        }
        $pdf->Output($filename,'F');
        
        return response()->json([

            "success"=>true,
            "responseBody" => [
                "change_status" =>"Success"
            ]
                    ], 201);

        

    }

}

json post请求数据为:

{
    "sourceFile":"/home/courage/Documents/TM 2020.pdf",
    "outputFile":"/home/courage/Documents/Signed.pdf",
    "pageNumber":"3",
    "signitureImg":"/home/courage/Downloads/signature.png",
    "x":"85",
    "y":"230",
    "w":"30",
    "h":"11",
    "pictureType":"png"
}
于 2021-01-16T05:54:56.133 回答
0

你可以通过旧的解决方案来做到这一点,但我在这里解释如何使用它。

# Add 2 page
$pdf->AddPage(); 
$tplIdx2 = $pdf->importPage(2);
$pdf->useTemplate($tplIdx2); 
$pdf->SetAutoPageBreak(true, 5); # optional line

在这里您必须注意,我正在添加将新页面添加到 PDF 中的AddPage()代码。添加页面始终是第一位的。这是必需的。

importPage(Page_number)将页面导入 PDF 的当前页面。

于 2020-05-09T07:47:08.483 回答
0

这是我的解决方案。这对我有用。

$pdf = new Fpdi();

$sourceFilePages = $pdf->setSourceFile($sourceFile);

    for($pageNo = 1; $pageNo <= $sourceFilePages; $pageNo++){

        $template = $pdf->importPage($pageNo);

        $pdf->AddPage();
       
        // $adjustPageSize needs to be set to true if you need to have the original PDF page dimensions 
        $pdf->useTemplate($template, 0, 0, null, null, true);


        if ($stampFirstPageOnly){
            if ($pageNo == 1){
                // stamping only the first page
                $pdf->Image($stampFile, stampXCoord, $stampYCoords, $stampWidth, $stampHeight);
            }
        }
        else{
            // stamping all the pages
            $pdf->Image($stampFile, $stampXCoord, $stampYCoords, $stampWidth, $stampHeight);
        }
    }

// pdfOutputMethod "I" -> Browser Inline, "D" -> Force Download, "F" -> Save to Disk
$pdf->Output($pdfOutputMethod, $fileName);
于 2021-09-03T07:00:03.337 回答