Ответ 1
Из php- Script вы можете использовать:
$pdf->Output(__DIR__ . '/invoices/Delivery Note.pdf', 'F');
Я использую модуль Tcpdf и PHP для создания dymanic PDF-счетов из системы заказов.
script должен затем сохранить счет-фактуру в папку под названием "счета-фактуры". Папка существует, и есть полные разрешения для "всех" (Windows).
Используемый мной код:
$pdf->Output('invoices/Delivery Note.pdf', 'F');
Для сохранения файла используется fopen.
Однако ошибка, которую я получаю, такова: Warning: fopen(): remote host file access not supported, file://invoices/Delivery Note.pdf
Это локальный файл, а не удаленный.
Я попытался добавить префикс как:
$pdf->Output('/invoices/Delivery Note.pdf', 'F');
но вместо этого я получаю эту ошибку: Warning: fopen(file:///invoices/Delivery Note.pdf): failed to open stream: No such file or directory
Я создал файл и оставил его пустым, но ту же ошибку, что и выше.
Кто-нибудь знает, почему я получаю эту ошибку?
Из php- Script вы можете использовать:
$pdf->Output(__DIR__ . '/invoices/Delivery Note.pdf', 'F');
После перехода на tcpdf 6.2.6 в vtiger 6.2 у меня была такая же проблема, отправив электронное письмо с pdf.
Итак, я изменил файл:
libraries/tcpdf/include/tcpdf_static.php
У меня прокомментирован код в fopenLocal() и изменилась строка
fopen($_SERVER['DOCUMENT_ROOT'].$filename, $mode);
см
/**
* Wrapper to use fopen only with local files
* @param filename (string) Name of the file to open
* @param $mode (string)
* @return Returns a file pointer resource on success, or FALSE on error.
* @public static
*/
public static function fopenLocal($filename, $mode) {
// if (strpos($filename, '://') === false) {
// $filename = 'file://'.$filename;
// } elseif (strpos($filename, 'file://') !== 0) {
// return false;
// }
return fopen($_SERVER['DOCUMENT_ROOT'].$filename, $mode);
}
После изменения это сработало.
похож на user1007017
, но просто прокомментируйте строку, как показано ниже (tcpdf 6.2.11)
public static function fopenLocal($filename, $mode) {
if (strpos($filename, '://') === false) {
//$filename = 'file://'.$filename;
} elseif (stream_is_local($filename) !== true) {
return false;
}
return fopen($filename, $mode);
}
Я обнаружил, что проблема в том, что путь для fopen должен быть из корня документа, а не из расположения PHP script.
C:\Website\www\script\invoice\invoice.pdf
Например, если PHP script находится внутри папки "script", и вы хотите создать PDF файл внутри папки "invoice", script должен иметь "\ script\invoice\invoice.pdf".
Я предлагаю использовать следующее, поскольку Герд также предложил, но убедитесь, что вы используете абсолютный путь:
$pdf->Output(__DIR__ . '/invoices/Delivery Note.pdf', 'F');
Путь должен быть абсолютным путем, а не относительным путем. В этом отчете об ошибке PHP объясняется, почему: https://bugs.php.net/bug.php?id=28820
Причина относительных путей не поддерживается в файле://обертка сводится к компромиссу в том, как обрабатываются пути UNC (и, более конкретно, как/нечетко интерпретируются как\для установки Windows).
Пример:
Файл://Foo/бар
Может интерпретироваться как относительный URI: foo/bar из текущего рабочего каталога, или его можно интерпретировать как UNC:\foo\bar (общий
bar
на компьютереfoo
).Для этого и нескольких внутренних причин файл://оболочка ограничен абсолютными путями при явном вызове. Для относительных путей либо используйте realpath() {, как это было в вашем отчете}, либо опустить явное обозначение обертки файла.
Затем вы можете избежать изменения кода TCPDF и беспокоиться о любых обновлениях, заменяющих измененный код.
В prestashop вы можете сделать это следующим образом $pdf-> Вывод (_PS_ROOT_DIR _. '/Modules/xxx/ticket.pdf', 'F');
попробуйте это
$pdf->Output($_SERVER['DOCUMENT_ROOT'].'/invoices/Delivery Note.pdf', 'F');