【问题标题】:jsPDF addImage not workingjsPDF addImage不起作用
【发布时间】:2018-12-19 17:14:40
【问题描述】:

我正在使用 jsPDF 通过循环一些 HTML 代码来创建 PDF 以找到它需要的值。我能够很好地获取这些值,但是当我尝试插入 header_img 时它不起作用。我在 Google 上找到了许多解决方案,但我现在使用的解决方案是唯一一个不会引发错误的解决方案。

这是用于获取通过循环提供的 url,将其转换为 DataURL,然后将图像插入 PDF 的代码。它没有给我任何错误,但 PDF 中的所有内容都是黑色边框并且没有图像。有什么想法吗?

function getDataUri(url, cb) {
	var image = new Image();
	image.setAttribute('crossOrigin', 'anonymous'); //getting images from external domain

	image.onload = function () {
		console.log(url);
		var canvas = document.createElement('canvas');
		canvas.width = this.naturalWidth;
		canvas.height = this.naturalHeight; 

		//next three lines for white background in case png has a transparent background
		var ctx = canvas.getContext('2d');
		ctx.fillStyle = '#fff';  /// set white fill style
		ctx.fillRect(0, 0, canvas.width, canvas.height);

		canvas.getContext('2d').drawImage(this, 0, 0);

		cb(canvas.toDataURL('image/jpeg'));
	};

	image.src = url;
}

var pdf = new jsPDF('p', 'in', 'letter');
	

var left_margin = .5;
var top_margin =.5;
var height = 2.313;
var width = 3.25;
var header_img_height = 1;

//Draw border
pdf.setLineWidth(1/92);
pdf.setDrawColor(0, 0, 0);
pdf.rect(left_margin, top_margin, width, height);
	
//example image
var header_img = 'http://www.quotehd.com/imagequotes/authors24/jeff-olsen-quote-two-clicks-and-its-broke.jpg';
	
let logo = null;

//callback to get DataURL
getDataUri(header_img, function(dataUri) {
	logo = dataUri;
	console.log("logo=" + logo);
	
  //Add image to PDF
	pdf.addImage(logo, 'JPEG', left_margin, top_margin, header_img_height, width);
});

pdf.output('save', 'test.pdf');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.4.1/jspdf.debug.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【问题讨论】:

    标签: javascript pdf callback jspdf todataurl


    【解决方案1】:

    您可以将图像编码为 base64,您可以使用 this tool 或任何类似名称并将其替换为您的代码。

    【讨论】:

    • 虽然可行,但我尝试在本地执行,因为此脚本将在本地服务器上,并不总是可以访问互联网。此外,脚本通过一个循环运行,并且在循环内分配了 header_img 变量。图像不是恒定的。
    • 反正我试了一下,使用Base64图片输出的时候还是不加图片。
    【解决方案2】:

    我最终通过编写一个将图像转换为 Base64 的 PHP 脚本解决了这个问题。

    $img_src = urldecode($_GET['url']);
    $img_str = base64_encode(file_get_contents($img_src));
    echo 'data:' . getimagesize($img_src)['mime'] . ';base64,' . $img_str;
    

    然后使用 jQuery,我将 url 传递给 PHP 脚本并得到 Base64 数据作为回报:

    function getBase64(url) {
    
        var out = '';
        $.ajax({
            url: 'get-dataurl.php?url=' + encodeURI(url),
            async: false,
            dataTye: 'text',
            success: function(data) {
                out = data;
            }
      });
        return out;
    }
    

    当然不理想,但它确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-02
      • 2021-06-09
      • 2019-01-04
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多