当前位置: 首页 > 知识库问答 >
问题:

dompdf:base64图像无法在Google应用程序引擎上运行

况经纬
2023-03-14

我希望有人能告诉我这是我的代码的问题还是dompdf GAE的错误。

下面的代码使用Google App Engine SDK在我的本地开发服务器上工作,但不在live GAE项目上工作。

其他基于文件的图像也可以工作,但我无法让任何base64图像(包括这个简单的示例图像)在线工作。

输出给出一个带有X的框,表示“未找到图像或类型未知”。

有什么想法吗?

<?php
require 'vendor/autoload.php';

$fullpage = '
<html>
<head>
<title>Base64 Test</title>
</head>
<body>
<h1>Title of Test Document</h1>
<img src="data:image/png;base64,R0lGODlhPQBEAPeoAJosM//AwO/AwHVYZ/z595kzAP/s7P+goOXMv8+fhw/v739/f+8PD98fH/8mJl+fn/9ZWb8/PzWlwv///6wWGbImAPgTEMImIN9gUFCEm/gDALULDN8PAD6atYdCTX9gUNKlj8wZAKUsAOzZz+UMAOsJAP/Z2ccMDA8PD/95eX5NWvsJCOVNQPtfX/8zM8+QePLl38MGBr8JCP+zs9myn/8GBqwpAP/GxgwJCPny78lzYLgjAJ8vAP9fX/+MjMUcAN8zM/9wcM8ZGcATEL+QePdZWf/29uc/P9cmJu9MTDImIN+/r7+/vz8/P8VNQGNugV8AAF9fX8swMNgTAFlDOICAgPNSUnNWSMQ5MBAQEJE3QPIGAM9AQMqGcG9vb6MhJsEdGM8vLx8fH98AANIWAMuQeL8fABkTEPPQ0OM5OSYdGFl5jo+Pj/+pqcsTE78wMFNGQLYmID4dGPvd3UBAQJmTkP+8vH9QUK+vr8ZWSHpzcJMmILdwcLOGcHRQUHxwcK9PT9DQ0O/v70w5MLypoG8wKOuwsP/g4P/Q0IcwKEswKMl8aJ9fX2xjdOtGRs/Pz+Dg4GImIP8gIH0sKEAwKKmTiKZ8aB/f39Wsl+LFt8dgUE9PT5x5aHBwcP+AgP+WltdgYMyZfyywz78AAAAAAAD///8AAP9mZv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAKgALAAAAAA9AEQAAAj/AFEJHEiwoMGDCBMqXMiwocAbBww4nEhxoYkUpzJGrMixogkfGUNqlNixJEIDB0SqHGmyJSojM1bKZOmyop0gM3Oe2liTISKMOoPy7GnwY9CjIYcSRYm0aVKSLmE6nfq05QycVLPuhDrxBlCtYJUqNAq2bNWEBj6ZXRuyxZyDRtqwnXvkhACDV+euTeJm1Ki7A73qNWtFiF+/gA95Gly2CJLDhwEHMOUAAuOpLYDEgBxZ4GRTlC1fDnpkM+fOqD6DDj1aZpITp0dtGCDhr+fVuCu3zlg49ijaokTZTo27uG7Gjn2P+hI8+PDPERoUB318bWbfAJ5sUNFcuGRTYUqV/3ogfXp1rWlMc6awJjiAAd2fm4ogXjz56aypOoIde4OE5u/F9x199dlXnnGiHZWEYbGpsAEA3QXYnHwEFliKAgswgJ8LPeiUXGwedCAKABACCN+EA1pYIIYaFlcDhytd51sGAJbo3onOpajiihlO92KHGaUXGwWjUBChjSPiWJuOO/LYIm4v1tXfE6J4gCSJEZ7YgRYUNrkji9P55sF/ogxw5ZkSqIDaZBV6aSGYq/lGZplndkckZ98xoICbTcIJGQAZcNmdmUc210hs35nCyJ58fgmIKX5RQGOZowxaZwYA+JaoKQwswGijBV4C6SiTUmpphMspJx9unX4KaimjDv9aaXOEBteBqmuuxgEHoLX6Kqx+yXqqBANsgCtit4FWQAEkrNbpq7HSOmtwag5w57GrmlJBASEU18ADjUYb3ADTinIttsgSB1oJFfA63bduimuqKB1keqwUhoCSK374wbujvOSu4QG6UvxBRydcpKsav++Ca6G8A6Pr1x2kVMyHwsVxUALDq/krnrhPSOzXG1lUTIoffqGR7Goi2MAxbv6O2kEG56I7CSlRsEFKFVyovDJoIRTg7sugNRDGqCJzJgcKE0ywc0ELm6KBCCJo8DIPFeCWNGcyqNFE06ToAfV0HBRgxsvLThHn1oddQMrXj5DyAQgjEHSAJMWZwS3HPxT/QMbabI/iBCliMLEJKX2EEkomBAUCxRi42VDADxyTYDVogV+wSChqmKxEKCDAYFDFj4OmwbY7bDGdBhtrnTQYOigeChUmc1K3QTnAUfEgGFgAWt88hKA6aCRIXhxnQ1yg3BCayK44EWdkUQcBByEQChFXfCB776aQsG0BIlQgQgE8qO26X1h8cEUep8ngRBnOy74E9QgRgEAC8SvOfQkh7FDBDmS43PmGoIiKUUEGkMEC/PJHgxw0xH74yx/3XnaYRJgMB8obxQW6kL9QYEJ0FIFgByfIL7/IQAlvQwEpnAC7DtLNJCKUoO/w45c44GwCXiAFB/OXAATQryUxdN4LfFiwgjCNYg+kYMIEFkCKDs6PKAIJouyGWMS1FSKJOMRB/BoIxYJIUXFUxNwoIkEKPAgCBZSQHQ1A2EWDfDEUVLyADj5AChSIQW6gu10bE/JG2VnCZGfo4R4d0sdQoBAHhPjhIB94v/wRoRKQWGRHgrhGSQJxCS+0pCZbEhAAOw==" />
<p>End of document.</p>
</body>
</html>
';

use Dompdf\Dompdf;
use Dompdf\Options;

$options = new Options();
$options->setDpi(96);
$options->set('isHtml5ParserEnabled', true);
$options->set('isRemoteEnabled', true);
$options->set('debugKeepTemp', true);

$dompdf = new Dompdf($options);
$dompdf->loadHtml($fullpage);
$dompdf->setPaper('A4', 'portrait');

$dompdf->render();

$dompdf->stream("Report.pdf",  array( 'Attachment'=>0));

?>

共有1个答案

高砚
2023-03-14

我相信我有答案:

dompdf的Cache.php中,base64图像首先被写入一个文件,在GAE上有两个问题。

  1. file\u put\u contents()只能与GAE中的存储桶一起使用。

为了克服问题1,您需要设置一个临时目录,它是一个存储桶。在GAE环境中,使用问题的示例代码,如下所示:

$options->set('tempDir', 'gs://myappname.appspot.com/mytempfolder/');

关于问题2,tempnam()

如果目录不存在或不可写,tempnam()可能会在系统的临时目录中生成一个文件。。。

根据http://php.net/manual/en/function.tempnam.php. 我的假设是tempname无法正确处理存储桶。我的解决方案是在dompdf的\src\Image\Cache.php文件中找到这一行:

$resolved_url = tempnam($tmp_dir, "ca_dompdf_img_");

并将其替换为:

$resolved_url = $tmp_dir . uniqid("ca_dompdf_img_") . ".tmp";

注意:要使其工作,您的temDir必须以/结尾,如上面的示例所示。它也必须存在。

因此,我们实际上是告诉dompdf使用一个与GAE一起工作的临时目录,并绕过一个在GAE中不能正常工作的函数。

 类似资料:
  • 我正在将一个非常基本的web应用程序部署到Google应用程序引擎。我使用的是Springboot,我可以在本地很好地运行应用程序,但当我部署到Google时,应用程序引擎不会启动实例。我在启动时配置了一个云SQL数据源。 我有云sql配置属性配置src/main/Resources/application.properties.App Engine似乎找不到这些属性,所以它无法正确设置Cloud

  • 更新:(2020年5月18日)本帖末尾的解决方案! 我正在尝试将大型CSV文件(30MB-2GB)从浏览器上载到运行Python3.7Flask的GCP应用程序引擎,然后将这些文件推送到GCP存储。这在大型文件的本地测试中效果很好,但如果文件大小超过20MB,则在GCP上会立即出现错误,出现“413-您的客户端发出了太大的请求”。这个错误在上传时立即发生,甚至在它到达我的自定义Python逻辑之前

  • 我想刮一个javascript网站使用Scrapy飞溅在谷歌应用程序引擎。Splash插件是一个Docker映像。有什么方法可以在谷歌应用引擎中使用它吗?App Engine本身使用Docker映像,但我不确定如何加载和访问辅助映像(这就是Splash的使用方式)。以下是Splash安装说明

  • 在python上的GoogleAppEngine中,我遇到了以下错误:在服务了总共2个请求后,超过了128 MB的软私有内存限制,达到了157 MB。我尝试使用以下命令来解决这个问题。上下文=ndb。获取上下文()和上下文。设置缓存策略(False)。我把这个方法放在appengine\u配置中。py,也在应该处理请求的处理程序中。我想知道是否还有其他地方可以放置这个命令,或者我是否应该总共使用一

  • 问题内容: 我正在尝试运行此项目-https://github.com/JumboInteractiveLimited/codetest 我已经下载了Docker工具箱,并执行了GitHub页面上提到的build和run命令,但是当我尝试访问http:localhost:8080时,该页面仍然不可用。 当我尝试再次执行运行时,Docker说 编辑 :澄清一下,我只有在第二次运行时才收到该错误。当我

  • 在Google Compute Engine上部署了一个Hadoop(Yarn+Spark)集群,有一个主服务器和两个从服务器。当我运行以下shell脚本时: spark-submit--class org.apache.spark.examples.sparkpi--主纱-集群--num-executors 1--驱动程序-内存1G--executor-memory 1G--executor-c