【发布时间】:2015-10-01 02:31:26
【问题描述】:
我正在尝试使用 jspdf 插件从 HTML 生成 PDF。我坚持将图像加载到 PDF 中。插件中有一个函数 addImage() 对图像进行base64编码,但是将图像转换为base64不起作用。
我用过以下两种方式
//创建画布,在上下文中绘制图像并获取数据url
imgToDataURL = function (img, outputFormat){
var canvas = document.createElement('canvas');
canvas.width = 20;
canvas.height = 20;
var c = canvas.getContext('2d');
c.height = img.height;
c.width=img.width;
c.drawImage(img, 0, 0);
c.save();
var dataurl = canvas.toDataURL(outputFormat);
return dataurl;
}
var img = new Image();
img.crossOrigin = 'Anonymous';
img.src = "image path"
img.height= 60;
img.width=60;
var dataURL = this.imgToDataURL(img,"image/jpeg");
renderer.pdf.addImage(dataURL, 'png',x+padding,y + this.internal.getLineHeight(),imageWidth,imageHeight);
这是打印错误的 dataURL 我得到一个白色的图像。如果我对 base64 代码进行硬编码,即返回一个硬编码的 dataURL,那么 addImage 可以正常工作。所以问题出在 canvas.toDataURL 给我错误的输出
这是第二种方式
convertImgToBase64URL = function (url, callback, outputFormat){
var img = new Image();
img.crossOrigin = 'Anonymous';
img.onload = function(){
var canvas = document.createElement('CANVAS'),
ctx = canvas.getContext('2d'), dataURL;
canvas.height = this.height;
canvas.width = this.width;
ctx.drawImage(this, 0, 0);
dataURL = canvas.toDataURL(outputFormat);
callback(dataURL);
canvas = null;
};
img.src = url;
}
this.convertImgToBase64URL("Image Path",function(base64){
renderer.pdf.addImage(base64, 'PNG', 20, 20,48,48);
})
我已经在 javascript 中运行了它,并且 onload 函数甚至没有运行我不确定我的错误是什么。
请告诉我我在这两种方式中犯了什么错误
【问题讨论】:
-
您必须等待您的图像加载完毕,然后才能将它们绘制到画布上下文中。另外,您确定使用正确的跨域标题提供图像吗?如果您的服务器设置不正确,
"anonymous"请求将被阻止,并且您的图像将永远无法加载。除此之外,您的第一个 sn-p 中几乎没有问题(即 context2d 没有宽度和高度属性,save()在这里没用)但没有人应该阻止您的代码。 -
是的,但我不确定如何检查图像是否已加载。对于少数图像,我确实得到了以下异常“来自来源的图像'图像服务器路径'已被跨域资源共享策略阻止加载:请求的资源上不存在'Access-Control-Allow-Origin'标头。来源'null' 因此不允许访问。”那么这到底是什么意思。我是 javascript/HTML 的新手,如果我问任何明显的问题,我很抱歉。
-
你很幸运,我刚刚为这些完全相同的情况写了这些问题和答案(在这种情况下,你不是唯一一个):stackoverflow.com/questions/32880641/…
-
@Kaiido 我写了一个类似的,但不幸的是 img.onload 从未被执行。而且我不确定如何设置 Access-Control_Allow-Origin" 标头。需要注意的一点是,我将所有内容都写在一个 JS 文件中,并在 HTML 中添加这个文件。加载图像会有什么问题吗?跨度>
-
@Kaiido 我现在可以获取图像,但我使用的是 chrome 的 CORS 扩展并在那里启用了跨域资源共享。如果我在那里禁用,则图像不会加载。你能帮我解决这个问题吗?我正在访问的图像位于服务器的公共文件夹中,我可以从 Web 浏览器访问图像
标签: javascript image canvas base64 jspdf