【问题标题】:Image not found or type unknown (using tinymce with dompdf to show html stored in tinymce textarea in a pdf)未找到图像或类型未知(使用 tinymce 和 dompdf 以显示存储在 pdf 中 tinymce textarea 中的 html)
【发布时间】:2023-03-09 08:32:01
【问题描述】:

我正在使用 tinymce 使用“laravel-tinymce-simple-imageupload”包上传图片。当用户在 textarea 中输入一些内容并单击表单提交按钮时,我想将 textarea 中的内容放在 pdf 文件中。我有下面的代码。

问题是在pdf文件中,如果在textarea中插入图片,图片不会出现在pdf中,并且pdf中出现“找不到图片或类型未知”。

你知道可能是什么问题吗?

图像在证书表的内容列中是这样存储的:

<p>test<img src="/img/image_15zdbBr.jpeg" alt="" width="1200" height="900" /></p>

获取pdf的代码:

$certificateContent = RegistrationType::with('certificate')->where('id', $request->registrationType)->first();
$pdf = app()->make('dompdf.wrapper');
$pdf->loadHTML($certificateContent->certificate->content);
return $pdf->download('test.pdf');

Tinymce 代码的 relative_urls 为 false:

tinymce.init({
    selector:'textarea',
    plugins: 'image code link',
    relative_urls: false,
    file_browser_callback: function(field_name, url, type, win) {
        // trigger file upload form
        if (type == 'image') $('#formUpload input').click();
    }
});

我已经使用了 "setOptions(['isHtml5ParserEnabled' => true, 'isRemoteEnabled' => true])" 但也不能使用它,它显示相同的错误。

似乎问题可能是因为需要更改图像的 url 路径。但我不明白该怎么做,因为用户只在 tinymce 文本区域中选择了一个图像,如何更改该图像的绝对路径。

【问题讨论】:

  • 尝试用绝对 uri 替换代码,例如 &lt;p&gt;test&lt;img src="{{ asset('/img/image_1530423144_Yn4tAJwZmzcbb82UOGHo07eIQsiGfzdbBjh10r.jpeg') }}" alt="" width="1200" height="900" /&gt;&lt;/p&gt;
  • 谢谢,您知道在哪里更改代码,在包的哪个文件中?
  • 它不是文件或包,它应该在您传递的内容中。如果 url 路径不起作用,请尝试使用绝对路径。
  • 谢谢,但是我用的是tinymce,只需要点击浏览图片按钮,选择图片,那么如何更改图片的url路径呢?
  • tiny.cloud/docs/configure/url-handling - 看看这个文档。你会在这里得到答案。

标签: php jquery laravel tinymce dompdf


【解决方案1】:

这是一个已报告的问题:https://github.com/dompdf/dompdf/issues/1659

建议你:

  1. 将 relative_urls 设置为 true(这会将图像设置为 img/image_15zdbBr.jpeg,并且
  2. 设置$dompdf-&gt;setBasePath($base_path) 其中$base_path 是文件所在的位置。 (https://github.com/dompdf/dompdf/wiki/Usage#setbasepath)

使用聊天中的重要内容进行编辑:

  1. 当您使用 Laravel 的包装器时,您需要获取 domPDF 类的句柄,您将通过 $pdf-&gt;getDomPDF()-&gt;setBasePath();
  2. 由于相对文件路径为../../../image/file.jpg,这意味着“从”基目录开始,后退一,后一,后一,进入img/,查找文件”。所以“基目录”需要在文件之前考虑到您要返回的事实。

工作示例:

  • 您的实际文件位于(真实)/home/john/projects/proj/public/img/image.jpeg
  • 相对文件路径(提供)=../../../img/image.jpeg
  • 所以你配置你的 setBasedirectory = /home/john/projects/proj/public/a/b/c/
  • 结合这给你/home/john/projects/proj/public/a/b/c/../../../img/image.jpeg
  • /home/john/projects/proj/public/a/b/../../img/image.jpeg相同
  • /home/john/projects/proj/public/a/../img/image.jpeg相同
  • /home/john/projects/proj/public/img/image.jpeg = Bingo 相同。

如果这不起作用,请调整您的 setBaseDirectory 直到找到正确的路径。

【讨论】:

  • 谢谢,但它显示“调用未定义的方法 Barryvdh\DomPDF\PDF::setBasePath()”与“$pdf = app()->make('dompdf.wrapper'); $pdf ->setBasePath("proj.test/img/");".
  • 您需要通过:$pdf-&gt;getDomPDF()-&gt;setBasePath("proj.test/img/")
  • 谢谢,图像存储在数据库中,如 "

    abbb

    ”。但是还是出现同样的错误。我还将tinymce插件代码更改为“relative_urls:true”而不是“relative_urls:false”。
  • 您将使用错误的 base_path(它应该以 / 开头,例如 /var/www/html/uploads)。为了提供帮助,文件image_1531443_Yn7tAZmzcbb82UOGHo07eIctkBjh98r.jpeg 的完整路径(在操作系统目录中)是什么,然后您需要返回一个目录(到img),然后沿着另一棵树备份三个目录 - 任何树 - 所以基础path实际上是img文件夹之前的一个目录。有点脑筋急转弯 - 但你会到达那里。
  • 所以你的基本路径应该是 /home/YourUser/projects/proj/public/find/another/directory/ 假设 ~ 是 /home/YourUser (所以设置它应该是什么)。希望这是有道理的?你想要三个从“公共”中下来;任何三个 - 哪个并不重要。
猜你喜欢
  • 2023-03-26
  • 2017-03-16
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多