0

首先,我使用公共共享服务器,无法使用composer,我使用自己的自动加载。

症状很清楚:

  • 7.2 版
  • Mpdf 版本 7.1
  • 每个需要的组件都为 Mpdf 加载,日志上没有错误,但调试信息如下:

    [2018-05-29 15:44:07] [调试] PDF 在 0.193712 秒内生成 [2018-05-29 15:44:08] [调试] 在 0.634812 秒内编译
    [2018-05-29 15:44:08 ] [调试] 内存使用峰值 4.00 MB
    [2018-05-29 15:44:08] [调试] PDF 文件大小 16 kB
    [2018-05-29 15:44:08] [调试] 1 使用的字体

我可以打开创建的文件,但它只包含内容的文本部分,没有单个表格或样式。

有什么建议吗?

编辑 1

我已经尝试过这些 html 结构:

$pdfContent = '<html xmlns="http://www.w3.org/1999/xhtml">
    <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <base href="'._PAGE_BASE_URL.'/">
        <style>
            '.file_get_contents('libs/css/reset.css').'
            '.file_get_contents('libs/css/pdf.css').'
        </style>
        </head><body>';

$pdfContent = '<html><head></head><body>';

当然,我在以下 PDF 渲染命令中使用了一些 table、div 和 span 元素:

$mpdf=new \Mpdf\Mpdf();
$mpdf->WriteHTML($pdfContent, 0);
$mpdf->Output('test.pdf');

我尝试仅使用 HTML 源的正文内容并尝试将其与以下内容一起使用:

$mpdf=new \Mpdf\Mpdf();
$mpdf->WriteHTML(file_get_contents('libs/css/reset.css').PHP_EOL.file_get_contents('libs/css/pdf.css'),1);
$mpdf->WriteHTML($pdfContent, 2);
$mpdf->Output('test.pdf');
4

1 回答 1

0

所以我做了一些测试,结果证明代码已经识别并成功使用了 CSS 文件,唯一缺少的部分是使用 HTML 标签。

那是我开始怀疑自己的地方。我真的为 Mpdf 加载了所有必要的文件吗?事实证明,我没有。在我意识到我不理解它之后,我做了一个简单的加载所有文件的“自动加载器”,并在一开始就包含在 src/Mpdf.php 文件中。

我已经进行了 2 次测试,等等。一切都在它的位置。不幸的是,我仍然不知道它缺少哪些部分,但经过一个半星期的试用,我并不真正关心它。

如果有人想使用 Mpdf 的较新版本,但不能使用 Composer,我建议忘记它。但是,如果使用一些非常混乱和愚蠢的代码来使其正常工作(就像我在这种情况下一样)不打扰您,请随意使用下面的加载器从Mpdf 项目目录:

function loadDirContent($dir){
    $dirContent = scandir($dir);
    foreach($dirContent as $item){
        $path = $dir."/".$item;

        // avoid unnecessary examination and load
        if($item == '.' || $item == '..' || 
           $item == 'Loader.php' || $item == 'Mpdf.php' || 
           strpos($path, "Psr/Log/Test")!==false || 
           (!is_dir($path) && strtolower(substr($item, -3)) != 'php')){
               continue;
        }

        if(!is_dir($path)){
            require_once($path);
        } else {
            // The Tag folder contains some dependency on folder contents
            // These files have to load first
            if(strpos($path, "src/Tag") !== false){
                require_once($path."/Tag.php");
                require_once($path."/InlineTag.php");
                require_once($path."/BlockTag.php");
                require_once($path."/NewColumn.php");
            }

            loadDirContent($path);
        }
    }
}

loadDirContent(__DIR__);

在 Mpdf/src/Mpdf.php 文件中,您必须需要加载程序文件,我存储在与 Mpdf.php 相同的目录中

require_once(__DIR__."/Loader.php");

当然也需要 Psr/Log 包,我从它的 GitHub 存储库手动下载了它,并将其解压缩到 Mpdf/src 目录。Mpdf 需要它并使用它,所以在 Mpdf/src/Mpdf.php 中你也必须调用这两行:

require_once(__DIR__."/Psr/Log/LoggerAwareInterface.php");
require_once(__DIR__."/Psr/Log/NullLogger.php");

在这些文件中需要一些“in-project-requires”,如果您不使用 autoloder,则必须在其中添加一些额外的 require_once 行。

我知道它既愚蠢又丑陋,但最终它可以工作,就像它与 Mpdf 的第 5 版一起工作一样,现在,我对此感到很高兴。

于 2018-05-30T05:37:54.843 回答