Сохраняйте PDF-файлы в папке с помощью TCPDF
Я установил модуль печати, а также библиотеку TCPDF для создания PDF-файлов. Однако модуль печати может просто создавать PDF-файлы для загрузки, но не для сохранения в папке сервера. Я попытался изменить метод _print_pdf_tcpdf в модуле печати, чтобы файлы можно было сохранять в папке сервера. Я изменил функцию _print_pdf_tcpdf следующим образом:
Я изменил строку
$pdf->Output($filename, $output_dest);
К этой строке:
$pdf->Output($filename, 'F');
Но этот код выдает ошибку:
TCPDF ERROR: Unable to create output file: https://mywebsite/sites/default/files/aaa.pdf
У меня есть установите разрешения для папки сайтов для записи. Другие модули могут записывать в эту папку, поэтому я не думаю, что проблема в разрешениях. Кто-нибудь может помочь , где может возникнуть проблема?
3 answers
Я сам сделал пару реализаций TCPDF в Drupal. Как предположил Клайв, вам не следует использовать URI в методе TCPDF output()
, вместо этого вы захотите указать абсолютные пути к файлам.
Этот код всегда работал для меня:
// Change the path to whatever you like, even public:// will do or you could also make use of the private file system by using private://
$path = drupal_realpath('public://folder/folder2/folder3');
// Supply a filename including the .pdf extension
$filename = 'file.pdf';
// Create the full path
$full_path = $path . '/' . $filename;
// Output PDF
$pdf->Output($full_path, 'F');
РЕДАКТИРОВАТЬ: Как упоминал Клайв в комментарии, drupal_realpath()
устарел. Вот альтернатива:
// Change the path to whatever you like, even public:// will do or you could also make use of the private file system by using private://
$uri = 'public://folder/folder2/folder3';
$stream = file_stream_wrapper_get_instance_by_uri($uri);
$path = DRUPAL_ROOT . '/' . $stream->getDirectoryPath() . '/' . file_uri_target($uri);
// Supply a filename including the .pdf extension
$filename = 'file.pdf';
// Create the full path
$full_path = $path . '/' . $filename;
// Output PDF
$pdf->Output($full_path, 'F');
Просто убедитесь, что вы всегда предоставляете абсолютный путь для TCPDF.
Просмотр сообщения об ошибке
TCPDF ERROR: Unable to create output file: https://mywebsite/sites/default/files/aaa.pdf
Похоже, что ваша переменная $filename
содержит URI вместо пути. Файлы не могут быть сохранены в URI; для этого вам нужно будет сделать HTTP-запрос с соответствующим глаголом. Так что, скорее всего, в этом и будет проблема.
Я не очень хорошо знаком с TCPDF, поэтому не знаю, поддерживает ли он обертки потоков или нет. Поэтому может сработать любой из них:
$filename = 'public://aaa.pdf';
Или
$filename = DRUPAL_ROOT . '/sites/default/aaa.pdf';
$pdf->Output( "myfile.pdf", "F");
TCPDF ERROR: Unable to create output file: myfile.pdf
В 'include/tcpdf_static.php "файл около 2435 строк в статической функции "Fopenlocal", если я удалю полный оператор "if"... работает нормально.
public static function fopenLocal($filename, $mode) {
/*if (strpos($filename, '://') === false) {
$filename = 'file://'.$filename;
} elseif (strpos($filename, 'file://') !== 0) {
return false;
}*/
return fopen($filename, $mode);