FPDF 获取 "Incorrect output destination" 但错误代码显示正确的目的地

FPDF Getting "Incorrect output destination" but the error code showing the correct destination

我正在尝试使用 FPDF 和 FPDI 编辑 PDF 并向其中添加文本。我一直收到 "Incorrect output destination" 错误,但目的地是我希望它在其中创建文件的正确位置,为什么 FPDF 不喜欢我的输出目的地?

这是在 laravel 项目中

    $pdf = new \setasign\Fpdi\Fpdi();
    $pdf->AddPage();
    $pdf->setSourceFile(public_path('/pdf/higher.pdf'));
    $tplIdx = $pdf->importPage(1);
    $pdf->useTemplate($tplIdx, 10, 10, 100);
    $pdf->SetFont('Helvetica');
    $pdf->SetTextColor(255, 0, 0);
    $pdf->SetXY(30, 30);
    $pdf->Write(0, 'This is just a simple text');
    $pdf->Output(public_path('/pdf/'),'higher2');
    return $pdf;

错误是:

 message: "FPDF error: Incorrect output destination: /home/vagrant/code/project-name/public/pdf/"

我也试过删除 "public_path()" 并将其设置为 Output('pdf', 'higher2') 也没有用。

此外,我还尝试将输出 pdf 的名称更改为 higher2.pdf,以防万一它想看到扩展名(但显然它在目的地而不是名称方面有更多问题)

我什至尝试过将此文件夹的权限更改为任何人都可以写入:

drwxrwxrwx  5 ion  staff    160 May 21 05:44 pdf

编辑:请注意,我看到带有 public_path() 的方法出于某种原因正试图保存到我的 vagrant 文件夹中,这是我感到困惑的部分原因。当我尝试在没有 public_path() 的情况下保存到 '/pdf' 时,出现此错误:

 message: "FPDF error: Incorrect output destination: /pdf/"

编辑 2:

我也试过这个:

$pdf->Output('F','/pdf/higher2.pdf');

并得到错误:

message: "file_put_contents(/pdf/higher2.pdf): failed to open stream: No such file or directory"

还尝试了肯定存在的 pdf 的原始名称,但得到了同样的错误:

$pdf->Output('F','/pdf/higher.pdf');

Output() 方法要求第一个参数是目标,第二个参数是文件名。

来自文档:

F: save to a local file with the name given by name (may include a path).

试试这个:

$filename="/pdf/higher2.pdf";
$pdf->Output($filename,'F');

永远不要覆盖您正在读取的文件!

Output()方法的签名是:

string Output([string dest [, string name [, boolean isUTF8]]])

$dest参数定义为:

Destination where to send the document. It can be one of the following:

I: send the file inline to the browser. The PDF viewer is used if available.
D: send to the browser and force a file download with the name given by name.
F: save to a local file with the name given by name (may include a path).
S: return the document as a string.

The default value is I.

所以你的代码:

$pdf->Output(public_path('/pdf/'),'higher2');

完全没有意义。我猜您想将生成的 PDF 保存到名称为 higher2.pdf 的 public 区域中的路径。所以你的代码应该是这样的:

$pdf->Output('F', public_path('/pdf/higher2.pdf'));

PS: You cannot edit a PDF with FPDI!

对于 FPDF 包,语法 $pdf->Output('F','/pdf/higher2.pdf'); 是错误的,您需要按照 Jan Slabon 的解释调整您的调用。

但是,如果你想支持UTF-8字符,那么你需要tFPDF包,setasign供应商也支持:

$pdf = new \setasign\Fpdi\Tfpdf\Fpdi();

对于这个包,您可以像这样存储输出:

$pdf->Output('/pdf/higher2.pdf');