Добавить изображение в pdf с помощью jspdf

Я использую jspdf для преобразования изображения в PDF.

Я преобразовал изображение в URI, используя base64encode. Но проблема в том, что в консоли не отображаются ошибки или предупреждения.

Создается PDF-файл с текстом Hello World, но в него не добавляется изображение.

Вот мой код.

function convert(){
        var doc = new jsPDF();
        var imgData = 'data:image/jpeg;base64,'+ Base64.encode('Koala.jpeg');
        console.log(imgData);
        doc.setFontSize(40);
        doc.text(30, 20, 'Hello world!');
        doc.output('datauri');
        doc.addImage(imgData, 'JPEG', 15, 40, 180, 160);

    }

person Navya    schedule 28.09.2013    source источник
comment
В чем тут вопрос?   -  person Suresh Atta    schedule 28.09.2013
comment
Диким предположением было бы то, что он или она хочет, чтобы img отображался в pdf.   -  person Brainmaniac    schedule 11.09.2018
comment
@Brainmaniac Дикое предположение / :) Я думаю, что вопрос был до редактирования или чего-то в этом роде.   -  person ehab    schedule 11.07.2019


Ответы (12)


Это сработало для меня в Angular 2:

var img = new Image()
img.src = 'assets/sample.png'
pdf.addImage(img, 'png', 10, 78, 12, 15)

jsPDF версии 1.5.3

Каталог assets находится в каталоге src корня проекта Angular.

person atik    schedule 02.01.2019
comment
Это сработало для меня. Пока я не добавил «png» в addImage, это не сработало. - person Rhokai; 27.07.2020
comment
У меня тоже не сработало при указании расширения. обработчик: Ошибка: неполный или поврежденный файл PNG - person PatricNox; 03.09.2020

Хотя я не уверен, изображение может быть не добавлено, потому что вы создаете вывод до того, как добавляете его. Пытаться:

function convert(){
    var doc = new jsPDF();
    var imgData = 'data:image/jpeg;base64,'+ Base64.encode('Koala.jpeg');
    console.log(imgData);
    doc.setFontSize(40);
    doc.text(30, 20, 'Hello world!');
    doc.addImage(imgData, 'JPEG', 15, 40, 180, 160);
    doc.output('datauri');
}
person Leon Hooijer    schedule 14.10.2013
comment
Каковы все параметры функции addImage? - person Grez.Kev; 29.04.2017
comment
@Grez.Kev Это было давно, но если я правильно помню, это: addImage (изображение, формат, xPosition, yPosition, ширина, высота). Надеюсь, это поможет! - person Leon Hooijer; 01.05.2017
comment
Это addImage(imageData, format, x, y, width, height, alias, compression, rotation). Прочтите rawgit.com/MrRio/jsPDF/master/docs/module-addImage .html - person Joel G Mathew; 12.11.2018
comment
Base64.encode('filename.jpeg') не кодировать изображение, этот способ подойдет только для имени файла?! - person Ivan Ferrer; 14.02.2020

может быть, немного поздно, но я недавно пришел к этой ситуации и нашел простое решение, нужны 2 функции.

  1. загрузить изображение.

    function getImgFromUrl(logo_url, callback) {
        var img = new Image();
        img.src = logo_url;
        img.onload = function () {
            callback(img);
        };
    } 
    
  2. в событии onload на первом шаге сделайте обратный вызов, чтобы использовать документ jspdf.

    function generatePDF(img){
        var options = {orientation: 'p', unit: 'mm', format: custom};
        var doc = new jsPDF(options);
        doc.addImage(img, 'JPEG', 0, 0, 100, 50);}
    
  3. используйте вышеуказанные функции.

    var logo_url = "/images/logo.jpg";
    getImgFromUrl(logo_url, function (img) {
        generatePDF(img);
    });
    
person AlanMo    schedule 01.03.2018

Нет необходимости добавлять дополнительную библиотеку base64. Простое решение из 5 строк —

var img = new Image();
img.src = path.resolve('sample.jpg');

var doc = new jsPDF('p', 'mm', 'a3');  // optional parameters
doc.addImage(img, 'JPEG', 1, 2);
doc.save("new.pdf");
person Abhishek Sinha    schedule 02.08.2018
comment
path.resolve — это Node JS. В основном он определяет правильный путь к файлу относительно вашего файла. Если вы не хотите его использовать, вы можете указать источник файла (/something/something/myfile.jpg) вместо path.resolve(). - person Abhishek Sinha; 26.03.2019
comment
Вы загружаете файл 'jpg', но устанавливаете его как 'png' в doc.addImage - person Paul Verschoor; 14.06.2019
comment
@MustkeemK Вы можете перейти по этой ссылке: artskydj.github.io/jsPDF/docs /module-addImage.html - person Abhishek Sinha; 23.12.2019
comment
в последних версиях addImage ожидает 4 аргумента. - person PatricNox; 03.09.2020
comment
вместо doc.save(new.pdf); можем ли мы использовать doc.open(new.pdf), чтобы открыть этот файл PDF в новой вкладке/окне. ? - person shavy; 15.04.2021

Вы определили Base64? Если вы не определили, возникает эта ошибка:

ReferenceError: Base64 не определен

person annelorayne    schedule 10.07.2014
comment
Вы можете использовать онлайн-конвертер и вставить строку в свой код. base64-image.de - person David D.; 17.10.2018

Я считаю это полезным.

var imgData = 'data:image/jpeg;base64,verylongbase64;'

var doc = new jsPDF();

doc.setFontSize(40);
doc.text(35, 25, "Octonyan loves jsPDF");
doc.addImage(imgData, 'JPEG', 15, 40, 180, 180);

http://mrrio.github.io/jsPDF/

person Saboor Awan    schedule 05.11.2014

Приведенный выше код не работал у меня. Я нашел новое решение:

 var pdf = new jsPDF();
 var img = new Image;
 img.onload = function() {
     pdf.addImage(this, 10, 10);
     pdf.save("test.pdf");
 };
 img.crossOrigin = "";  
 img.src = "assets/images/logo.png";
person punitha puni    schedule 26.03.2018

У меня была такая же проблема с тем, что Base64 не был определен. Я зашел на онлайн-кодер и сохранил результат в переменную. Это, вероятно, не идеально для многих изображений, но для моих нужд этого было достаточно.

function makePDF(){
    var doc = new jsPDF();
    var image = "data:image/png;base64,iVBORw0KGgoAA..";
    doc.addImage(image, 'JPEG', 15, 40, 180, 160);
    doc.save('title');
}
person MrGood    schedule 25.02.2016
comment
У вас есть изображение/png, но добавьте как jpg. Это звучит неправильно - person mplungjan; 10.01.2017
comment
@mplungjan data:image/png это просто опечатка, с data:image/jpeg все в порядке - person Reverie; 22.10.2019

если у вас есть

ReferenceError: Base64 не определен

вы можете загрузить свой файл здесь, у вас будет что-то вроде:

данные: изображение/jpeg; base64,/veryLongBase64Encode....

на вашем js сделать:

var imgData = 'data:image/jpeg;base64,/veryLongBase64Encode....'
var doc = new jsPDF()

doc.setFontSize(40)
doc.addImage(imgData, 'JPEG', 15, 40, 180, 160)

Пример можно посмотреть здесь

person Ibrahima Timera    schedule 28.03.2019

Сначала вам нужно загрузить изображение, преобразовать данные, а затем перейти к jspdf (в машинописи):

loadImage(imagePath): ng.IPromise<any> {
    var defer = this.q.defer<any>();
    var img = new Image();
    img.src = imagePath;
    img.addEventListener('load',()=>{
            var canvas = document.createElement('canvas');
            canvas.width = img.width;
            canvas.height = img.height;

            var context = canvas.getContext('2d');
            context.drawImage(img, 0, 0);

            var dataURL = canvas.toDataURL('image/jpeg');

            defer.resolve(dataURL);
    });

    return defer.promise;
}

generatePdf() {
    this.loadImage('img/businessLogo.jpg').then((data) => {
        var pdf = new jsPDF();
        pdf.addImage(data,'JPEG', 15, 40, 180, 160);
        pdf.text(30, 20, 'Hello world!');
        var pdf_container =  angular.element(document.getElementById('pdf_preview'));
        pdf_container.attr('src', pdf.output('datauristring'));
    });
}
person Gerard Carbó    schedule 27.07.2016

В TypeScript вы можете сделать:

private getImage(imagePath): ng.IPromise<any> {
    var defer = this.q.defer<any>();
    var img = new Image();
    img.src = imagePath;
    img.addEventListener('load',()=>{
       defer.resolve(img);
    });


    return defer.promise;
} 

Используйте приведенную выше функцию для получения объекта изображения. Затем следующее добавить в файл PDF:

pdf.addImage(getImage(url), 'png', x, y, imagewidth, imageheight);

В простом JavaScript функция выглядит так:

function (imagePath) {
        var defer = this.q.defer();
        var img = new Image();
        img.src = imagePath;
        img.addEventListener('load', function () {
            defer.resolve(img);
        });
        return defer.promise;
    };
person Hongyang    schedule 10.06.2016

Для результата в base64 перед преобразованием в холст:

var getBase64ImageUrl = function(url, callback, mine) {

                    var img = new Image();

                    url = url.replace("http://","//");

                    img.setAttribute('crossOrigin', 'anonymous');

                    img.onload = function () {
                        var canvas = document.createElement("canvas");
                        canvas.width =this.width;
                        canvas.height =this.height;

                        var ctx = canvas.getContext("2d");
                        ctx.drawImage(this, 0, 0);

                        var dataURL = canvas.toDataURL(mine || "image/jpeg");

                        callback(dataURL);
                    };
                    img.src = url;

                    img.onerror = function(){

                        console.log('on error')
                        callback('');

                    }

            }

   getBase64ImageUrl('Koala.jpeg', function(img){
         //img is a base64encode result
         //return img;
          console.log(img);

          var doc = new jsPDF();
              doc.setFontSize(40);
              doc.text(30, 20, 'Hello world!');
              doc.output('datauri');
              doc.addImage(img, 'JPEG', 15, 40, 180, 160);
    });
person Ivan Ferrer    schedule 14.02.2020