Получение FPDF Неправильное место назначения вывода, но код ошибки показывает правильное место назначения

Я пытаюсь использовать FPDF и FPDI для редактирования PDF-файла и добавления в него текста. Я продолжаю получать сообщение об ошибке «Неверное место назначения вывода», но место назначения является правильным местом, в котором я хочу создать файл. Почему 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() по какой-то причине пытается сохранить в моей бродячей папке, это часть причины, по которой я запутался. Когда я пытаюсь сохранить в '/pdf' без public_path(), я получаю эту ошибку:

 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');

person movac    schedule 23.05.2019    source источник


Ответы (3)


Вы никогда не должны перезаписывать файл, из которого вы читаете!

Сигнатура метода Output():

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

Параметр $dest определяется как:

Место назначения для отправки документа. Это может быть одно из следующих:

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.

Значение по умолчанию — I.

Итак, ваш код:

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

не имеет абсолютно никакого смысла. Я предполагаю, что вы хотите сохранить полученный PDF-файл по пути в общедоступной области с именем higher2.pdf. Итак, ваш код должен выглядеть так:

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

PS: Вы не можете редактировать PDF с помощью FPDI!

person Jan Slabon    schedule 23.05.2019
comment
ага, добавление общего пути таким образом сработало! По какой-то причине он будет сохраняться в корневом файле, если я установлю его на Output('F', '/higher2.pdf'), но не будет работать, если я установлю его на ``Output('F', '/pdf/higher2.pdf') Спасибо! Что касается редактирования, я просто имел в виду, что добавляю текст поверх него с помощью FPDI. - person movac; 23.05.2019
comment
Вы должны прочитать это об относительных и абсолютных путях ;-) Вы также добро пожаловать, чтобы отметить мой ответ как принятый. - person Jan Slabon; 23.05.2019
comment
Спасибо! Я использую mpdf, а Destination — это каталог в моей голове. Не тип выхода. Благодаря вашему ответу я теперь знаю, что пункт назначения неоднозначен и тип вывода. - person Maarten; 22.10.2020

Метод Output() требует, чтобы первый параметр был пунктом назначения, а второй параметр имени файла.

Из документации:

F: сохранить в локальный файл с именем, заданным по имени (может включать путь).

Попробуйте это:

$filename="/pdf/higher2.pdf";
$pdf->Output($filename,'F');
person Sapnesh Naik    schedule 23.05.2019
comment
Итак, я тоже пробовал это, и по какой-то причине это работает, если я делаю имя файла "/higher2.pdf", но не пытаюсь поместить его в свою папку /pdf, есть идеи, почему? - person movac; 23.05.2019
comment
@Maribov существует ли папка pdf? - person Sapnesh Naik; 23.05.2019
comment
[...] первый параметр должен быть местом назначения, а второй параметр - именем файла. а почему параметры в примере кода меняются местами? - person Jan Slabon; 23.05.2019
comment
Папка pdf существует в той же папке, в которую она сохраняется, если я оставлю ее как "/filename.pdf" - person movac; 23.05.2019

Для пакета FPDF синтаксис $pdf->Output('F','/pdf/higher2.pdf'); неверен, и вам нужно настроить свой вызов, как объяснил Ян Слабон.

Однако если вы хотите поддерживать символы UTF-8, вам потребуется tFPDF пакет, который также поддерживается поставщиком setasign:

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

Для этого пакета вы можете сохранить вывод следующим образом:

$pdf->Output('/pdf/higher2.pdf');
person Adam    schedule 11.11.2019