HTMLDOC не выполняется из PHP

Я пытаюсь создать PDF из файла HTML со страницы PHP (Apache, LAMP). Странно то, что когда я выполняю скрипт из командной строки, он работает и создает PDF, как и ожидалось. Однако, когда я просматриваю страницу в моем браузере, она ничего не делает. Я думаю, что это где-то проблема с разрешениями, но я в тупике! Вот код (ПРИМЕЧАНИЕ. Команда ls выводит в браузере вывод, поэтому проблема не только в том, что PHP не разрешено выполнять команды оболочки)

    <?php 
    $htmlName = ("output2/alex" . time() . ".html");
    $pdfName = ("output2/alex" . time() . ".pdf");
    $html = "<html><body><h1>Hello, World!</h1></body></html>";

    $fileHandle = fopen($htmlName, "w+");

    fwrite($fileHandle, $html);
    fclose($fileHandle);

    $command= "htmldoc -t pdf --browserwidth 1000 --embedfonts --header ... --footer t./ --headfootsize 5.0 --fontsize 9 --bodyfont Arial --size letter --top 4 --bottom 25 --left 28 --right 30 --jpeg --webpage $options '$htmlName' -f '$pdfName'";

    echo "OUTPUT: \r\n";
    $X=passthru($command);

    echo "TESTING LS:";
    $y=passthru("ls -al");

    if(file_exists($htmlName) && file_exists($pdfName)) {
        echo "Success.";
    } else {
        echo "Sorry, it did not create a PDF";
    }
?>

Когда я выполняю сценарий из командной строки, он выдает ожидаемый результат и создает файл PDF, как это должно быть:

> php alextest.php
Zend OPcache requires Zend Engine API version 220131226.
The Zend Engine API version 220100525 which is installed, is outdated.

OUTPUT:
PAGES: 1
BYTES: 75403
TESTING LS:total 2036
drwxr-xr-x  9  ----- and so on...

Когда я просматриваю страницу в Chrome, она выводит только команду LS.

Помогите!?

1 ответ

Вы можете попытаться использовать полный путь, поскольку ваш php-файл может выполняться в другом каталоге, чем он сохраняется в зависимости от того, как он загружен. (IE через include, require, или же .htaccess или напрямую по apache.)

IE

$htmlName = ("/home/alex/html/output2/alex" . time() . ".html");
$pdfName = ("/home/alex/html/output2/output2/alex" . time() . ".pdf");

Я согласен с комментариями, что было бы лучше использовать пакет типа http://dompdf.github.io/ или https://tcpdf.org/.

Я видел ту же проблему, и на всю жизнь я просто не мог найти ответ на вопрос, почему он не будет делать это через веб-вызов, но никогда не возникал проблема из командной строки. Таким образом, вместо того, чтобы пытаться найти решение в этом направлении, я создал прокси-сервер Perl, позволяющий мне анализировать PDF-файлы из командной строки, что делает его полезным практически для любой конкретной цели. Ведь с Perl у меня никогда не было проблем с парсингом PDF-файлов, и я делаю это уже десятилетия.

Итак, вот что вы делаете. PHP-код:

exec("/usr/local/bin/perl5 -s /path/to/perl/executable/parse-pdf-from-html-document.pl -source=markup-file.html",$output);

foreach ($output as $aline) {
    #- WAS SUCCESSFUL
    if (strstr($aline,'Successful!') == TRUE) {
        #- no feedback, win silently
    }
    #- NOT SUCCESSFUL
    else {
        echo $aline . "\n";
    }
}

С участием $output проведение результатов запуска exec.

Теперь давайте посмотрим на код Perl для parse-pdf-from-html-document.pl:

#!/usr/local/bin/perl5 -s

#- $document coming from commandline variable, via caller: PHP script
$myDocumentLocale = "/path/to/markup/document/".$document;
if (-e $myDocumentLocale) {
    $documentHTML = $myDocumentLocale;
    $documentPDF = $documentHTML;
    $documentPDF =~ s/\.html/\.pdf/gi;

    $myDocumentHTML = `cat $myDocumentLocale`;

    $badPDF = 0;
    $myPDFDocumentLocale = $myDocumentLocale;
    $myPDFDocumentLocale =~ s/\.html/\.pdf/gi;
    $badPDF = &parsePDF($myDocumentLocale, $myPDFDocumentLocale);

    if ($badPDF == 0) {
        print "Successful!";
    }
    else {
        print "Error: No PDF Created.";
    }
    exit;

    }
else {
    print "Error: No document found.";
    exit;
}

sub parsePDF {
    my ($Ihtml, $Ipdf) = @_;
    $wasBad = 0;

    #- create PDF
    $ENV{HTMLDOC_NOCGI} = 1;
    $commandline="/usr/local/bin/htmldoc -t pdf13 --pagemode document --header ... --footer ... --left 1cm --size Letter --webpage -f $Ipdf $Ihtml";
    select(STDOUT); 
    $| = 1;
    #print "Content-Type: application/pdf\n\n";
    system($commandline);
    if (-e $Ipdf) {
        $wasBad = 0;
    }
    else {
        $wasBad = 1;
    }
    return $wasBad;
}

exit;
Другие вопросы по тегам