parallax / jsPDF

Client-side JavaScript PDF generation for everyone.
https://parall.ax/products/jspdf
MIT License
29.2k stars 4.67k forks source link

Image content for phonegap app on android #207

Closed pascalPimaia closed 10 years ago

pascalPimaia commented 10 years ago

I m trying to use addImage in a phonegap application. All the code works perfectly well on a desktop browser but results in a corrupted pdf file on android.

toDataURL returns a png image string instead of a requested jpeg image string. I used the JPEGencoder framework which can be found in this repo https://github.com/owencm/javascript-jpeg-encoder.git to fix this.

There is a copy of the code I use at the end of this post. The code prepares data for addImage and does pretty much what addImage does at the beginning when passing an Image object.

Once the document is written I can observe a /Image object in the pdf script code but it differs from what I obtain on a desktop computer (JPEG algo probably differs). what bother me is that Acrobat reader complains there is an error in the pdf file and no image is displayed.

Here is the piece of code I used

    var getJpegImageDataURI= function(img,w,h) 
    {
        var canvas      = document.createElement("canvas"),                 
            ctx         = canvas.getContext("2d"),
            url         = undefined;

        if( w === undefined )w=img.width;
        if( h === undefined )h=img.height;

        if(ctx!==undefined)
        {
            canvas.width  = w;
            canvas.height = h; 

            ctx.drawImage(img,0,0,w,h,0,0,w,h);

            var toDataURLFailed=false;
            try
            {
                url=canvas.toDataURL("image/jpeg",1.);
            }
            catch(e)
            {
                toDataURLFailed=true; // android may generate png
                alert("toDataURL failed try JPEGEncoder if type deos not match jpeg: " + e);
            }

            if( toDataURLFailed || (url.slice(0,"data:image/jpeg".length) !== "data:image/jpeg") ) // check not jpeg type 
            {
                    // fallback generate jpeg data 
                    try
                    {       
                        var encoder = new JPEGEncoder();
                        url= encoder.encode(ctx.getImageData(0,0,w,h), 100);
                    }
                    catch(e){
                        alert("JPEGEncoder failed"+e);          
                    }
            }
        }
        else 
        {
            console.error("[IZIWATT-CONTOLLER] 2d canvas not supported");
        }
        if(url===undefined)alert("getJpegImageDataURI return undefined");
        return url;
    };
MrRio commented 10 years ago

This PR may be of interest to you as it adds PNG support

https://github.com/MrRio/jsPDF/pull/195

On Wed, Mar 12, 2014 at 9:43 AM, Pascal Sautot notifications@github.comwrote:

I m trying to use addImage in a phonegap application. All the code works perfectly well on a desktop browser but results in a corrupted pdf file on android.

toDataURL returns a png image string instead of a requested jpeg image string. I used the JPEGencoder framework which can be found in this repo https://github.com/owencm/javascript-jpeg-encoder.git to fix this.

There is a copy of the code I use at the end of this post. The code prepares data for addImage and does pretty much what addImage does at the beginning when passing an Image object.

Once the document is written I can observe a /Image object in the pdf script code but it differs from what I obtain on a desktop computer (JPEG algo probably differs). what bother me is that Acrobat reader complains there is an error in the pdf file and no image is displayed.

Here is the piece of code I used var getJpegImageDataURI= function(img,w,h) { var canvas = document.createElement("canvas"),

ctx = canvas.getContext("2d"), url = undefined;

if( w === undefined )w=img.width;
if( h === undefined )h=img.height;

if(ctx!==undefined)
{
    canvas.width  = w;
    canvas.height = h;

    ctx.drawImage(img,0,0,w,h,0,0,w,h);

    var toDataURLFailed=false;
    try
    {
        url=canvas.toDataURL("image/jpeg",1.);
    }
    catch(e)
    {
        toDataURLFailed=true; // android may generate png
        alert("toDataURL failed try JPEGEncoder if type deos not match jpeg: " + e);
    }

    if( toDataURLFailed || (url.slice(0,"data:image/jpeg".length) !== "data:image/jpeg") ) // check not jpeg type
    {
            // fallback generate jpeg data
            try
            {
                var encoder = new JPEGEncoder();
                url= encoder.encode(ctx.getImageData(0,0,w,h), 100);
            }
            catch(e){
                alert("JPEGEncoder failed"+e);
            }
    }
}
else
{
    console.error("[IZIWATT-CONTOLLER] 2d canvas not supported");
}
if(url===undefined)alert("getJpegImageDataURI return undefined");
return url;

};

Reply to this email directly or view it on GitHubhttps://github.com/MrRio/jsPDF/issues/207 .

James Hall Director

Parallax

+44 113 322 6477 http://parall.ax/

Registered office: The Old Brewery, High Court, Leeds, LS2 7ES Registered in England no. 07430032 VAT No. 101 3405 84

pascalPimaia commented 10 years ago

Thx for the info In which context (operating system & browser type x version) was this PR used ?

sebastianperrone commented 10 years ago

Hi, I'm having exactly the same problem as pascalPimaia. I'm using phonegap (with cordova 3.4). I can generate pdf files, text is correctly exposed, but the image is corrupt. I use a similar proc to load image:

function loadImage(photoUrl, cbFunc, cbErr) {
    console.log("image chrome loading");
    var imgLogo = new Image();
    console.log("image created");
    imgLogo.onload = function() {
        var canvas = document.createElement('canvas');
        console.log("image canvas created");
        canvas.width = imgLogo.width;
        canvas.height = imgLogo.height;
        console.log("image size setted");
        var context = canvas.getContext('2d');
        context.drawImage(imgLogo, 0, 0);
        console.log("image context created and image drawn");
        var imgData = canvas.toDataURL('image/jpeg');
        console.log("image data: " + imgData);

        // added from: https://github.com/MrRio/jsPDF/issues/207
        if (imgData.slice(0,"data:image/jpeg".length) !== "data:image/jpeg")  {
            try {       
                var encoder = new JPEGEncoder();
                imgData = encoder.encode(context.getImageData(0, 0, imgLogo.width, imgLogo.height), 100);
            } catch(e) {
                alert("JPEGEncoder failed"+e);          
            }
        }
        cbFunc(imgData);
    };
    imgLogo.src = photoUrl;
    console.log("image order logo file: " + photoUrl);
}

As you can see I added the section to convert image data with jpeg encoder, in this case does not shown any image. The section where I call loadImage function is this:

function createOrder(cbFunc, cbErr) {
    console.log("create pdf object");
    pdf = new jsPDF("p", "mm", "a4")
    var srcFile = "../img/jpg.jpg";
    loadImage(srcFile, function(imgData) {
        try {
            // section A
            pdf.addImage(imgData, "JPG", 14, 28, 44, 18);
            console.log("image added to pdf");
            printText(rows); // function which add text (this works fine)
            $this.pdfOrder = pdf;
            console.log("before callback");
            cbFunc($this.pdfOrder);
        } catch (err) {
            alert(err);
            cbErr(err);
        }
    }, cbErr);
}

am I doing something wrong ? is there any solution to this problem ?

By the way, I test the following scenarios in the section comented "section A":

var imgData = "data:image/png;base64,iVBORw0KGgo..."
var imgData = "data:image/jpeg;base64,/9j/4AAQSk..."

In these tests the image appears corrupted, is shown more gray or black and white, but never with the appropriate contents. All test were performed with android 4.2 (genymotion emulator and alcatel one touch idol phone). The SDK of jsPDF was 1.0.0 trunk.

Any ideas ?

diegocr commented 10 years ago

jsPDF 1.0.88 supports passing a canvas object directly to addImage(), so how about if you try that way instead?

I.e, replace:

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

By:

cbFunc(canvas);
sebastianperrone commented 10 years ago

Thanks for the alternative, but still show a corrupted image. I changed the code to this:

function loadImage(photoUrl, cbFunc, cbErr) {
    console.log("image chrome loading");
    var imgLogo = new Image();
    console.log("image created");
    imgLogo.onload = function() {
        var canvas = document.createElement('canvas');
        console.log("image canvas created");
        canvas.width = imgLogo.width;
        canvas.height = imgLogo.height;
        console.log("image size setted");
        cbFunc(canvas);
    };
    imgLogo.src = photoUrl;
    console.log("image order logo file: " + photoUrl);
}

The resulting image was this: ordercanvas

diegocr commented 10 years ago

You have removed the .drawImage() call too, which obviously you shouldn't do :)

Ie, add back (where it was):

    var context = canvas.getContext('2d');
    context.drawImage(imgLogo, 0, 0);
    console.log("image context created and image drawn");
sebastianperrone commented 10 years ago

Ups. Its true sorry. I fixed and try again, but still showing corrupted image. Also I try JPG and PNG params in jsPDF addImage function. The code:

function loadImage(photoUrl, cbFunc, cbErr) {
    console.log("image chrome loading");
    var imgLogo = new Image();
    console.log("image created");
    imgLogo.onload = function() {
        var canvas = document.createElement('canvas');
        console.log("image canvas created");
        canvas.width = imgLogo.width;
        canvas.height = imgLogo.height;
        console.log("image size setted");
        var context = canvas.getContext('2d');
        context.drawImage(imgLogo, 0, 0, imgLogo.width, imgLogo.height, 0, 0, imgLogo.width, imgLogo.height);
        console.log("image context created and image drawn");
        cbFunc(canvas);
    };
    imgLogo.src = photoUrl;
    console.log("image order logo file: " + photoUrl);
}

Resulting image: canvas2

diegocr commented 10 years ago

In fact you could omit the format parameter and it should work too given a canvas, ie pdf.addImage(imgData, 14, 28, 44, 18);

That said, are you sure imgLogo contains a valid image? post what this returns:

console.log(imgLogo.complete, imgLogo.width, imgLogo.height,
      imgLogo.naturalWidth, imgLogo.naturalHeight, imgLogo.clientWidth);

Edit: Use that within imgLogo.onload function.

sebastianperrone commented 10 years ago

I modified the function according to your instructions. Still show corrupted image, I placed all requested log. Image data URI, is truncated to 4K, the log function does not show more data, but, if you cut and paste in browser address field, shows the first part of the logo. Remember, in a computer browser all works fine (image surely are correct and consistent), also I tried with images jpg, png 32 and 24 of this link: https://github.com/MrRio/jsPDF/pull/195

04-11 22:14:06.600: I/Web Console(2460): image data: data:image/png;base64,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

04-11 22:14:06.592: I/Web Console(2460): imgLogo.complete: true at file:///android_asset/www/orderingHistory/orderingHistory.js:714
04-11 22:14:06.592: I/Web Console(2460): imgLogo.width: 165 at file:///android_asset/www/orderingHistory/orderingHistory.js:715
04-11 22:14:06.592: I/Web Console(2460): imgLogo.height: 74 at file:///android_asset/www/orderingHistory/orderingHistory.js:716
04-11 22:14:06.592: I/Web Console(2460): imgLogo.naturalWidth: 165 at file:///android_asset/www/orderingHistory/orderingHistory.js:717
04-11 22:14:06.592: I/Web Console(2460): imgLogo.naturalHeight: 74 at file:///android_asset/www/orderingHistory/orderingHistory.js:718
sebastianperrone commented 10 years ago

I forgot post the used source code:

function getOrderItems() {
    console.log("create pdf object");
    pdf = new jsPDF("p", "mm", "a4")
    var srcFile = "../img/orderLogo.jpg";
    //var srcFile = "../img/32_bit.png";
    //var srcFile = "../img/24_bit.png";
    //var srcFile = "../img/png8_trans.png";
    //var srcFile = "../img/jpg.jpg";
    loadImage(srcFile, function(imgData) {
        try {
            console.log("init loading image: " + srcFile);

            //var imgData = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKUAAABKCAYAAADaOZSNAAAgAElEQVR4Xu1dCXiU5Z3/zWRmMjOZ3BeEK4RwnyrIoSDggbZu0W3BRzxW67G2Xm1XXft4tF2trW237erq6nrU2hbUalsVPFCEVQgESrhDgARykJCQ+5j72t/7fvPNlckBJpLCvM8DSb755j1/3//+/z+Nnw1nsInhNRpN1Ax88Ps1oetihoFbqtsd2Frbjr0nu3CkxYqGDgc6nR54A8tIMeoxLDkRkzPMuHBkOpaMSUeSIaH7CsP6PIPLjw8dYwc0ZxqUgI/T0gamFv67ckmA1ub2YU1pA94/chJ2r5+AM2L+yFTMyknF6FQTzHqtvE+A2+ryorrdjp31nfisugUVrU7MH56CB+aNRlaSIXgfCEriXsV6HBxDaAeGACgF8kKUUN0bcanT5cGzO45jfWUzJqYmYeW0HCwdkwEtwRSbwkZf9+FElwfP7TyOD4804p4L8nDzrBFI0IiHoPsDMITO5ZyeytAAZfQREJFvldbh19tqMGdEKr43bwzGpZlCd0WDOPB3bxy5tNmK3xaV4+nLJiPdaIiTyCEM+6EByig03bV2P0obrXjmqsmYNSylz+3rj3gYi7L253t9Dh6/YcB3YGiAMrAsIQ8uX7MThZlmvHD1tIFZbBB5key6J/Y/MIPGe/kyO3DGQamCo8vpxeV/KMZVE3Lx2KJxAQUkCkiq6Hk6JC7qO6fTxZfZ6Ph3+78DZxyUYqpevw+XvV6MpQXZeGxhYe+zHyA0qZaw7uao/m9e/M7B2YEvD8reQBLOOv3UeMPMkcKsqJonb3qnBOlmk5Qh4y2+A18elH3tYQRoFXbs5jUt/yUQp78qOoqNx05i3Q3zInoaIILY1+zinw/BHRh8UEYtWhjCu6jQ5CTpsb22Dbe8txdFt85HaqIupmcnZFgfgrsXn9Kg7MBXAMqQsiKUGWHMHp2WCB28mPfKVjx56UQsG5fdfXFxUjkoB/6P0OmAg5JeazLoSF+29M7YvfAatfDa/HT3afHwJ6XodHvx3Nemy32KxGDc2/KPAJ7BmuOAgzLWRJttbmjMenS0O5GfmojSk524/q+7sfnbC5CsjxEsITuJA3OwDn2o9zuooPSR/DVaXdBaDKSdfhidPlgSE/D1P23HjTNH4fppw3vdn7iBe6jDZ3Dm9+VB2YPsJy53OZ3o1CZK04+DIWdjM41Ye6gBvy0+hk9vjtS2uy0vLlMOzon/A/T65UEZc5E+mn20qG51IEFvRIIOyNT5ZIjZRa9uxS+vmIQFDD2La9b/AAg5A1McBFAqsmBNmxN6Btt63IDbqlDJP+yuxXtHGvDnFecryk3MAN8zsAvxIYfUDgwCKKlpOzxoodHH2mWH2WhErhEw6TS46OUiPPu1aTg/T4n8iYNySGFhyExmgEAZ0pQF0CpaHNAYEsm2NfDYHIz6MeHN/SfwRmkt/rpydnDxcbFxyOBgSE1kgECpUD3RGrpc8JoT0dJkR4rFhGy9F2bmyFz6+634yZIJuHh0ZmgDhHouwsjjLb4DYTswIKBU2bDD40dlh4cWRpp/DHp4HXaMzzJjw7FG/HJLJT68cU48JyYOvz53YEBAqY4i2LbOYkQrUw/SmFOTnuBBikGHlW+VYMW0YVg5JS+ehtDnkcRvGDBQiqjxEw7AanPCbDbD47RhUpYJVW12rPrLbnxx6wJoI6PX4rsf34GYO3AaoIxy/wW0lUONduhMJroSO5GRnQyLy4VMenJ++OlBmHV6PLq4UGHdPRnbezQPxU67jQfnnr2IPiVQdksiDACp1eZBK9NWO1ptMCQmwuvxYHquCR7maC/74za8c91spLFIgNqEzNnBEDav10sXN4sOsGODTgsdAyz1VHxEnGW0uSiuqZ+9IIxe2SmBMpYtRwDsYL0dWpMRts4uZGalIJOqTjIjgkSu9fMlNXjkogJsr2vH/sZOHG11oYZmIgFiH4E4jOmu+bRljjPrMMqSiFwGbuSSwuYmG5FhMsBk8CNJrwdd5nFF/RzB5emBMrA5gno1Wz1opx/RzfIpQuO2kUp22GzYXNOO3+2tRQVlSpcw/RiTJeeGn9RRmI/8HqKMSCPatPxetkmPfAKyMNmAQksSRiUnYXiamQAlIPnNBL+b1FaHVL1fmpji7ezdgS8FSrEtVfRvw2DAzupmbKhoovnnJA43O4EU+rYJJPhIS90e6DwumBO1SCJ11FLjEazbSROSzeODU8viAAQikliChQb3XFLHCYxEH2dKwAizAcOo0edRmx+dkwK/j+CkLz2PYI1bOM9OYPYJypBsF503LaKAPHj3uBMvfbEfn1ecANEFJJuRl6Tw2klZSbh5+nDkp5sxIsVI81ACjHodEig0+j1eOAhIKwN9a7scONJswz4Wrdp6ogO7OlxwEKRZRhPy9T6MM2gwRoDTpMOIVAsmj81Amtsu+4wrPGcfMPsEZbclk/P6qJn85WADfvL5MeyvbgXtP5g4djgWjkzG9VOHs/hUGm59dzfunzsW80edejRQRZsNn1a2Yn1VC7a22NHu05GVJ2McKWkhqeYEFrVanAPMzCV1jbezbgf6BUpF81Uo5QdUXh7ZdBi7T7qRadLgytFpWFaYhQWT8pBLWdFi0qKu04lV7+zCJ/8yD/oAj43QnvupSovb2pxuVk4jJSX1bKCZKSfRgBmpRkzLiQPyrENjYEH9AqW490BTF+5ffwgbax2YkwYsJwiXFOQg3UAtmjX1HKSeE5kQJmImn91+DMcIpF8vi+dxn63AGcx1dQNlNBFzez147PMq/GZHDeblpuCJRWNw0ZhM1NqY6kATkNvrQxLlSA09OVOHmWWFgW+9sRP3zM9nwdKw4IvBXEW877NqBwhKWrjJlmPFNm6sYk3H9UdJ/RLw00UFuKIgQ5p1jrAimjsxicbyDllVIC0jBekE77BkPertZN1v78GHN8ymtUcthnpW7Vl8MYO8AzHZtwDow5+V4d3yFjw4byxum8lAikCz04yzr8EuQSzMOgkJtDOSOgoPjpHmnNf31KCoug0v/JOSOhtv8R041R2IAKWgghV0FX7/o1KMpDLxFOMf0+lVCW/CLmnVJzISqI02wwQk00ST4LJi2rBkedstf9uDr0/IwTenDJPuw7jJ5lSPJH6/xkeSpxqhPyo/SUpXi3+ZNbJb1QpBGVlVHCXHO+HXmeB22SS1TKdbMcXrIIhNEFT06j9twxsrLkA27YrxFt+B09kBgtJLUGrx1oFaHGt24F8vHI1UBk+Ee0tUebOJLsVajxZdrZ1yLK1WGMIDrJv28k2sTf7c9mq8fd358fyb0zmN+HfkDmgYyeP/uKIRiVRYlrCmT3TJFXlXQCXfW2+F32BCO8PT/Lw/2UyWTYp5/giFdT9O+6VZp8PDFxfEtze+A6e9A5qyxg5/Cv3RufQt95YuY2eo2S4BSsqRbr9TlvJLzUhFss+JgnSlSP433tjBKryFmJOXHo7lU5pcuBWg52zH2CVdegqtUycQ+jzqPT2BG5SAkVjv9elP5mVPr14ZjPIzPZXK7m0s9bOwe5S0qkA2wGDM85SOPnizxkFS2ZfpRsxdFBZoY+BEewupJA9ORJGLCPMCi5YFT3Wo77Tjhr/tx7rrZ0stfCCaGFdIsjGpd8wBwrMqvVSylGii003l7RbTGQbY/vYp8+k0PopDinkstjMrrCxYwI3b+5pjBD6H4yvW3nR7YlUwxrr5zAK03x6d7VX0cRstsFqtfA+NBnoG8/o9Dsyln1uYI987VI+3D5zA69eepzx5/XQlykJWgSq/4mjcwmwaBqSeHhgVFPKnGDDwHLTSTrqHdtT5I9K62Ul7A1LkdAOHIiLshHrH9dZ3uCEUwZvEe3gC5lf5nf6uU70vrM/wasbqfonku211rZhNR4WFkVLBOYeN09eQdXy51Qae140MhlGtH72uPZw79NX5QFCbPvroFyi7nH4etB1ut1u+no6ORVhSUqBz2zBzuEUO8e+fHkIeK2LcPzc/MGSsooA9z6aDOT5XshC/w6dl7KQHfgb2zuBbIl79RsjeGQsE0Xv42u7juK24DUVXj8HcPMq6Eqwh4Pc4gzDQxIqJK6nrwOLXtqHqe0uRxpC6fpm6ejvgCNYZmtXGYy24/BNWEbkkA9dOzA19oN4f4B4hsDE+lRwhnDcJhfMbq3eg9sHLI6ra9TSdmA/kVwC+nobQ+GkTinUI4U9WebMdHVrm37S0yrCMBJKH1PQMZGpdGJWqmH6EPPmjhRNwAV/GdMqNu9LidGHEbzbhteUzMXuYha+o0zDinNFBjEKPyY16YKWtdhf2kVLOyUuTVTkUSAZEgC9BBcqZoXnp69uw765FSGFAssxz5xx7E1QiqVM/co3YpQjl21HfjvNIKUV143CuEb4PvS3lQEMXrlyzA0fuWRwmSoldEM9opJet5xcSnDkW3ielFAvZWkV3osEIh80q90Ww70Sy76mZeqY96CDqT1739k6sXTU3Qp7sj9ylbm6Lw4UJz3yOTbfMx1RGAAUPO4qCbTjajOMdVinTFtd24Zkrp0QoaE0sPfjn0hO0tY6SwSHRja56PLXlKPYxIv68DBMeXjA2guophyReVsoIJb6G7+dFFWi3+jgnE57dVoXiOxZE5BupkCehx882V6Cs3YW52SZ8n77/WOvfwbSQkro2Gbj8LivQPXf1VJjoFVOXKdj373ZV0/mQJ0twB0EZEFHEfW8eqMc79LaNNGvxbxeOpY04UblPzhz0uHVhxZ9LsOab5zH6vwZepp48OHsM8rneUAuBbvW+Oqw+eFI4m3HV2Cz865yRpyDHnzIJ6vMLvYOSq2xnTcl9jU44WdZPHIBgG3p6dDReF+aPUeRJYVJ6raQWa1bMUgY8BYokuRKB0EoAjPvtJronZ2AW4yTF5hakJTGZTIGn2uVzxVW47/PjmJejw4qJOXxF3tiIRX5R2UI2ux31DyxBNnN+otuKN3eindTolpmj8avio5iVbcEry2cEQ/PUwcSLSS965QuMSLPgsvwsrD/aRMdBK8rvXxwEu8pCBQ36+upiaKgI3jAtD09vOYZFo1Px31dNYneRD4aIQ/3WR0cxI8mLa/jOoB9dwizPsLf4irf05v/3F9h9x3zMyFFEo/D2X8WVeGJLBR+mcdhF8N00NQdXFjK4NKyVNXXiwle3YwKtIqJ097a6TrR0WbHrroXd+nvv0El8e+1evMx9d9DCUkmP3r9fFPmg9omiAb6hT0opWHer1kitu10OLbTCJEsyDF4bzstTNu1R+skFW3hi6QTlTE+jmlqbw43CZzYii6apJOb8GFgT/Z3rLpByangTHqfH/q8cx+65RFLL6FbEN9de/UYJyu9eggxGwIdXhhGF/xe8sgVND10hqd1+sskLWXSr7qHLkcaiCWoTIHul5Dge+ewg6v/tCkmJ9zAi/srV21FGlqiyVfX+TRzzCsqbnY9cKZWrIoL3Sr4X6CT7Neoi84mEvPctBqyU37coYky1r+NUUqa+sAV/v/0SjCcnCm+igl3mrz7G75efj2umhOrEq/utiimHmxyY9+pmFN+6COOzDShrcGLJ65tR98DSblzhyU3VePPgCez/bh/1QgcYeL11FwJlD9RtC4MrfDqzZN3qE52enoYUn00WrhLXRBDGpMwUvl87VYJA0DYNzSBK61+kUCuDeQtIKddePwfzRilV2ZS3zUa2F7ZX4Q/7arDltotDH4TNfWtNK762+u8ov3cpMs2RgHintB7XvXsAl5OKieYgyy1taMHOOxdKN2l4u+293Tje6cbHN8yRl4v5jvFrKDfHAqVY/x0fH8HSEeIh1cp+jzR3YPedF8vXOYc3ocH/4MMylN67KHg5fOsFKKf8z2ZsuXk8pmaLdI/QGsoa3Tjvd3ux947JGM8UkyCFpUzil0ZmhSXvbXDg2rfLceDOaUw/AXacsGLl2xU4+N0ZMAa6E0HbQtIWsQxX/Xk/f8/DrKx03HK+Acvyw01pYRpWIJpMECb5Wmp+JH6qD4WYjyqj9gQ6ZVxBABR8qH2E7mfv7CR81Ii+RA7ODsptwsomc7RFJxw4hZp3vtkrU2FFizbL9DShnq/70Mo3RwhQfsR6Q3Npzump/e/OaggNu4j10rtrGT5sO97B8tXFOCxBGUlp3j/cSNl3F7Z9e75MpNQR9Gm0sYpMytADoBzW7QRlNWu0f3LTXDmVkoYOXP3H7TgoKKWo0x7mafgTszbvZhBL8W3zadJKgD6BMQFGDSPzTYr5KAx1QtS5/4NSlN17ScQSVSpXxwdh8vMbsXHhDzEz9SjjCURZER/B5MXe1nxcvOlp7LzsPkxIbmJePT/ix+In0+dlo2EAf28eh5XbHsK2Sx/AsKROfFI/ETdvvwcHLv8+LCylQ4KrNJriRPpyO5XMEusUrDu5AC+UXYXPFj2I2ekVfLe6sFoQQILASLOdAiRVyZN4CGAiHEZ9gVNRO30kYPxNADnYj/iNhC4WKFXkC/mmzpWIjjbaKANNhKqJNm+kBUkDmOrayo3JF6BcNYd5PYpHKKIFZv7ijmq8srsGxbcviGmWEexbUMqK+5YEQSm/yv9qO1m89bcbsJ6lrRfnMwCZ10S6RXihBHXMNfsbcNf7uymbXg4TFSahDNz9wQHU0CQk6rYHccZfyplTNOnZjZJ6X5iXKpUkYQUQ/WqkITNE8QWlvJugrLhvcfc18ooA5cRnN2Hr0u9gWmoF+KxKcqSnC83uNWDUB2/i59NfxZ1T16Kr04BmlwV5huYgKEV+fElrIZZvfhIlV9zJB64DGxom44ZtD6N82e10A7uZ8qy87U2Ap8ttRpqeiqOQkpxM7Ht3LdZc+GNcO6oY3JoeW9DGGiCZalSPXK4yZcWGG6OpoJX3iKcpcKO47uKYvVJKYZtzJCShq71DoYbcW6F1i/K8C8emRbklo1xfAfT3vKzIT4SmO+Y3n+Ejvnls/sjQ65QjqbAPL/Kl9L8jKLfdcZGyeDlOaOyi4wTlHyNBqY4k+nqG7P8/NldiaX46Ong6o5MT8NLVM7rhn5nBuPatHawi58XIFANqWqyoYdZl6XcWRcq5nIBIpHv6i6P4xY4qLBuThSby7ymZBloGpkbI12L89UdbcM+63Th836UxzUkClBMoW3+x+B7MtJTDJmOwFTJo0fnxauUyPLT/O7gqZxdK2sbihlHr8fCU1bC5BR/VwkyKur11Mr659afYftktGE5QfnpyGlbteASHlt7EPrzwBNishSazR0tvxod1c3Fx9iGUto+BnXN8f8GjpFc2eV90U6iksIuq4pk4hBAVjXXePeoY/J4EZrAvcZpUoqMppdqBoNwbK5qhoabtYsKW8HWLZk62wOR1YvYoJQgj1KL9yadmPBfj7W3oxHiaLYQno6fWaHNBmH0mU2vuvmNM+yW4y6lBTmeOuOp5iZ7JHo4j5KxsKkKXFWSBlhVJ0YRjINwDIvr/5FgzOmiBWDQ6mbU3vRiXzjwkFk8IbyrV3HWC/fJ1LMMpDlzOfmO5W4VCV92uzE+OFSXLi1I3eyjnjmm8gGJCFZwuBWwq67RQNNjaUoCSpvNpw63GFTk7iVm/zJOS7kyCxuo14ag1H5OTD5HCgiVyjKiwjsKMlCPKvQEvlXrv5uaZONxeiGxjE1aM3MB5u6VcLORZFTBBDxprSEjXr+pKphLhV2UHbooQiyTVDLuuIXhYjIfL4Mj8fkTjfDQBC4uyGTFAqX5B1AcqaXLC5XDysMRTIbqlPEmjuVByZD5OoKlUujdDco8oC/ugd2NzbGNurKewB52tP1OIeU8Ete6l89gUQZn3qVoknKUFlHMrwe2XLVxOM/OQRUEHogFWj6I6hD9M4oxN/FxQWQaBgfE2lDU1BCs7ipINxb1SHxTUmPfymZEypzht9UGQEyDIfF5eTZ7FIie0xDiPBiaWgITUq0kAsuHs+hR+ZxXVGN7L7nSpy6mtWuBq/4DhaK0EH6s7m1UtX8gQlCsdpSxW0aoAWTx7/jBQRm9aOWtNNnhZa7KlKSARKZBLT8/EcJ090hA7ACgI2KyDvuRTPcRoNPU0pZAHI1LW63u83jwcfXCFU90fvwvW0kkMJ6yE3aEATlUOotcpKKSQcBWZTqjDUWCSX4icgJ9A1pBq9VmcSbJXUl9hUknIgmH44zDk3A3niZ/CVf04NMzTMhe8R8dKPkHbzr8LYD16DUnz5zCMfxc6sxCxHARdC2yHL4LWOBFJE4qUGbF8j6DE9rLz4LEf4HzEHMVaaXHoSfveQVOQlRHm1q4u5UkVTw47SrKkYFKqHzlC8+7JHnmKh9AbgGKxuPCDEcxIsZ5GgSbMQNkX4FRFSAp5/Zh7b/1Ffxb8u4dS2jGHY7kb+4Hx1OKrg5RSMk0hzjE2QJbCES5OSjkCYImjX4TXugGe5jcJHh6skHMVY4nCTkkFNQJg4iLZp7Hw9/C0/wWelvckGNR7Jfgpt3Z7jSG/o8u8Dobs7yHBOB3Oxl/CWfVj6NJnwzxxBxxHV8Dbvg5JM61wnXwC3rZ3YJq0B9byJfB3FcMyqwvOmgfhbnyBdaPS4KPXyjxhHdfD1JqyiznHcI2ILwKLBUoh331a3swFGmQQhtoEy9CTF8zJM0nNsq/Djn6q43/3bwf8cMF2YAIpZTgoFVNMQtoqssCZ8Hash69zg5TnDCN/AZ9tM9zN7/Kzsfy3iIefx89a4W56WSBX3qfPWkUtuxC6rO/CdeIncDU8T0AY+PetpHJj4WlbA791T5CCRph2yLoFP7DMqIen6VU4q39IfcMMc+E6aJJpNnPTAkCxzlY2D9qkKbz+f3BUroK38yMkTW/jd56D7di91E2IoYxFMI7fCFvpVMm+Iym2AKVI0gmTScS2CWG8uI7aF91O8tMARZTmIC5w8dh0aSaJt4HZgeDDHSCbfgZO2w5OjAQlQaHP+BY55WoC7UWSu8lwHftn+JztsEzdBWfraniO/4LsdQUSx74FT+NL0GbeSjZ7M1z1a6DPXQVT/mtwt70NfdpKAoafNfwBxjE/hj77BwTkG8RGFmxVK4RVOgQUVQYVlJ4taUaTHN9V9Qj8iekwj19H+TaJ1JjOB20qx7sLrtZ1BOU7lCmXMTOhkbpLHtxVd8F+kvMm1bZM3gWvuwaOsuV8GMKppKroxIgSElb+SgcDeltbFNYtWAX/GVhdDfR5XzouQ2px/QrfGphzO7d6oUwpQGnQVAXZt6ycaDkfxtHPSzHKZyuF48RDPPRWmCf/XVI5R+2vYMxeCf2IX8C6Kx/maUVwt78PV+XPYJr6Pnl6J+z7b4TlghK4BLDq/ocseTkShz8GL6mcv6MIzvrHudeuSOolgMkxBbW1zDpBFv087JVPwDTiVhhGvwzrwcnwdB5C6nm1vM+Nzv0F0gqgt1wAQ8HbBG0aug4UwudqYk386ZK1248sILVnvEA3Q0sP7Ht3XRdaNCZ0trREAM+UZIaOoFxMG2UME9a5BZwBXW1AQ5eyu5BrQ4pOUPsmKBMyvkk5biW89v1IHPZj2Movhre1CObpZQTlH+GsfBKGvBuQOOJZdO3JJChLKTf+idefIjieIoW8Hq6a78BU+B4cNfdKUCaO+AHlxElUrh0E6Hdh3T+K4DmhmGlUKkkqjQSTpMC6lKsYjNMBewWptKcBSVP2wGMtIii3wZj7AAnjr+GofoBK9xTO8XEkpCyDo+IaeKj8CPZvyn+WFP9OWPcw/cbHN4kEzUGS+nFMOhxi2Sk/P9YOVwIr89qo5ATItqCKSbRRGphOuzBfcQPGZcqBQmZISROKm4Zk0VoaKVNKSmkuhCnvP6nk6OCz74Oz7kekXk4YRzxFYGyhorOW5pm5SEi/keC7D4kjn4S3aysBS7lPn04q+4JANolZLVnwSwTKZrLYBTAMe1Q5z/bPYG/6teSC8u/AQ6KlaclHc44+827FFkqC5elYC3fnPhjSFlIJup34ZcGxzo8pWr4sFafEsa9QJRlH8N8OT9cR6FibVFwXc/C6jsFd97QC/GCMhDpeDEop3FqfHmkKKDmKkUx1FyWnpsFMMj8vENAwUEdyLvcTerDDrAeSUkYrOkKlFjSC8VjC0C9qxQszCmW0CBNPwGgt2KIAgTAmicOX1Xn4XdWwLbRyDb0LrEEr4Sf6knq36iUJHIpio1XMTOLBUOcbGlu5pjatWmZP9CruJ+7EWMEm5iesCOEUMgIAMUDZYvdgC6tXeemEFLYkCcoAr05OS0e6n8GxDFmLy5OD+SjRVLJ/BMypbdAwFUWhIaGm+J1VV0XkZxE3ShOXaufqbb4CrIopKdRiXwvNRek36OMWxnzhmw220OfiYVKn25tPXHyVaV/Ev088e9IBKZdezYjsw1YdutqU+Ek1xEj8lpKWhQxYMSsOysFEpCQG7sqb6NFp4ps2QhFA4eKS+F0QNSVkLXYLugYj7MnCaiLsnEJMUC0oLPlN75BXelQi++oOIvFdEV7W8xYopiRB0Hq20Ii5h3knw544SSmVqmtqEwUH6j1GgjJSyRELES7GnAQXi1mFXIyDejrxzs/JHVAoZSAYQdBYkY/TQUG2q7NNeRJlzJvwZnqRmZuNVG+XLOscZ9/nJF6+kkV3077XH2lhPf1EOB1KAStpo6RwaqZ7UUsf1dTMRIZyBaJk+uGS+0pWER/krNqBCFCK9918eLCJ6Q86enPcklIKUFoyM5HAdy3OJCCzWBi1P/7hs2qX4ov5SncgQqZsZ/rDJ2WMMme+tY9Gch3BmUQzUCYt/LNyjTI+Mc62v9LzOScHi6CU4gXyW+qccNvtMLJOkEj+mpiuwwRWqggaICT1PCf3Kr7or2gHgqCU5iD6vPe2KSYDnY9aNpPqg/JjYEIRZglei+PzKzqpc2iYCEpZ1mRFgyEJDr7Yc84wvrAzUKEhLkOeQ4gYAkuNAGURzUE2WuYXsKi+ma+e62/O9hBYR3wKZ9EOBECpuIcqGm3ITRGJWwywP40qF0FfONsAAAAPSURBVGfRvsSXcgZ34P8B1GBNPFazQYQAAAAASUVORK5CYII=";
            //var imgData = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKUAAABKCAYAAADaOZSNAAAblElEQVR4Xu1dB3hUVdp+507vyaRBgrQk9CawNMVGBwEVBV0rWNi1rOuKP4gQJhRxUdfddWV3XRcLa0NUIAUUESslgCBIb9IlbTIzmd7+904STEyDEEJi5j4PD3Dn1Pe+92vnO+dK0NQu89rWCGEApKGeEJAKfzAB8BsBQcL7gERigyD8hFBoPyDdCPuZL/DCPY6mNs3mPF5Jk5j8tE+0MMjugBC8kaTTkIh7EAhtRNC3E7LQMZjHOs/N44llahiNbRCS9IUMN0CQtkcwmAOn5XksnJjXJObbzAfZuEkpkjFK+jikkhHwhw6SXO8itGE9zObgeT+3mWtaQi15hCQdDb/3FXRzvoGJEwPnXT9SsMERaLykTMueBJnkSQiyLXALf8H8IYcvCp1ZmZ2p8qfBY5uG5+60XFRbkcqXFIHGScq0zFchlXaidHwc80Zvv6QIRBpvdAg0LlKK6lobWEmUDiN99NRGh1ZkQA2CQOMhpXmZDiHNOgSFLErHuQ0y+0gnjRKBxkHKZcuk2K3+DFJhHdLGzG+USEUG1WAINA5Szsl6GwjmI33s4w0280hHjRaBy0LKPaddbeTKUCA1RnMSszOnMQg+BOk3jmq0KEUG1qAINDgpd+e6rpYiMKFjnHaGJC2jB1df3oLHOigSpmnQ596oO2tQUu484RitUAnvyKTC1Smmu/ZizuQchHwzMHf82kaNUmRwDYpAg5Hyh5PF9yQmat/MK3Qu7BirnYk5WX/mQrWeoZ+HG3TGkc4aPQINQsq9ucUzEuK0C/MLXadSTep2kpkrU6GSvwe7bCBeGBFJlmj0NGnYAV5yUu46U7wooYX2KbGjvLOuO7q00LyHtOw1QOhNzB3zbsNON9JbU0DgkpJyx2nbzbGx+o8k7KUoz/Fd10RdH8xadSOXEJ9A+pghTQGgyBgbHoFLRsr9p22xIblst0KljpdKAY/dM6xDguozpGdvgDc4DQtu3NDw04302BQQuGSk/P6U/Z24BN0dfh9gKSz+umeS/ho8vepuKISbGJOc0BTAiYzx8iBwSUi59WThmLiY6ExHsQcqlZy5uB6GgDTf0uNmYq7k4Ujmz+V52E2l13on5YkTIbVF7tqt1SrbyWQCiiz2L3smGq5DWsYkbk+YhLmjb2kq4ETGeXkQqHdSbjtuW5DQUj+zMN8FnV4Fb5H1hk6topktnvUF17dncevCN5dnqpFemwoC9UrKTYetqQaDalcQIaVaraSUtG3qc4VxIGauvB4yYTrmjh3ZVICJjPPyIVCvpNxy3LYiLl4/3lLogDFKK6ru8b2TDKtoSy7nFJcxDLTs8k010nNTQaDeSLn9hOU6ncGw3uF0Q61Rw+Fw7OmdqO/KuGQ77n59G8K2a7jhy99UgImM8/IhUG+k/O6ENccQbfiNrcgOU6weRfnFv+vVSv9vmDOfo8ft4upN+uWbZqTnpoRAvZBy60n7bVHRumW2IgeUSiW8XnduS0HXvkXaVC8SmQGkUozHjGHWc8CEQgLe2GG4QavR9jN5lLEBpaK1PtqfEK/ztND4XR1a6m0SicTblICMjLX+ELhoUm7dulUeTEjdpdPrOjrsTsTF6QCHN61tjHIe17hH8bCAhxHwzoNUNYAHCXSDBClcZkyCRhmtVsl1V2gUshSNStpeKwsmqpX+eI3MHatVWGLUyrM6tfywDNI9SpVii0XAd/0NkoL6m3qkpcaKwEWTMue47T5TnP51t9UJrVIBuzfgnLt+593Ld+W2h0J2P7PK20EiVUKlFY9UYVSI5wiESv/wpBUopBBUMsSqFWjPP6k6FdozlHSFQYNEOkvxWjlU4ih9rnypXPGJy+l8pXcrw8bGCmhkXBePwEWRMhQKyQ/luXYrtOrUbcfysPZIPtYeOOs/ZPPIoOfxPmUE9FMTu10BktJBkjoQBE+oCAq0NdUQQlooNQpoSVqNihltEiTJgWSVFMlqOVrxpxY6JQmqQ6s4PYRAAF6X+4VeidrpVPHnf1LGxWMVaaGBELgoUu7Ndd27zRZ8499f7cLXh3OZdUGO6Eku+M4gJIQgCe5FQLIUgeBRBKSnoeThUy63C744P6R2ATqvGijWwadPZBwzhaTtCZVsEGSyXoiJUcVyibKtPIQUhYA2JGhLjRyJRi06J5uYBlf45A1tY/7SQDhFumlABOpOyjnZt8YaNX/Pz3e05Bk96NCuBbrHac+s3P3T3f6iog0waN7gSWgvMbN80wXPRwwjqXXDoJKOhkLSX6XRtEg0GpCiVSOZUjOVal3vsT79YN/E5y647UiFRo/AhZMy7LwIC2kI9oxRASPaGDE8JQGDO7WEzuVdlGBSTsecTxMh8b0DbBl60bHJx7INaKPoCIUmBWokdNIb/O0E767VE3t/2ejRjQywTgicPymfzu4CnezvkGuGwF60eda1qcmjOyXFmqhaAyEJmKEWshYHel6brNuFtMzH6NUkMzb5xzqNKlKpWSNQOykfekiO1rfP53F8T5B9m2GxP3N67qhiT1D2baHdpfL6/dDqdbDb7FuuahPVL4xmWvZHdGRextwb1zdrdCOTrxMCNZPSnHEdZKrFjCs64fbPRPrwT8VeNh61fKg3Rd1is9goEIHoWAOsefZpA9oaXsTMpS0hj3kHkuIRME+MBMDr9Fiad6XqSSlugZVxJUYqeR4zh/63DKbPjrnb64TAPmpreSBAJ1omo5Mt8dlDvk5D20QdQdrqe4HAVZSSDzVvaCOzrysClUk5KzuZh4v+laQ7BUneDJgnF5Vv/OujRQtNscYZlgLxtoQ5k3oUW61fX93edE243JysN3neeCZJ+UFdBxWp17wRqEjKtMwRJNpkBrWXYP7osKouf21gVnnAbzmkVGkTPQw3igs0UTFGWAoKpw1uG/MizK+rEIzLZkB8IpN585s3tJHZ1xWBn0k5J2sil/+SYZG+gpdH01isfH1+pGiiKdr4vr2oJLdCELhEKEiCbmmw6/WJhn0wf3wdtfpjkY1hdX0ckXoiAhLGEWUI9RoOicwL842f1QTLF4ctnxqjjMPs1hIHR6PVwVls+/6a9qZe4Xppq+byawxOmMdEgtoRftUZAQnE+KPgtWPBTSdqamXdrqJkhVG6TxKCTHRwxCs6Jop5k5ZF1ySbpodvpGetgh8LMG/M5jqPKFKx2SMgwWPZSqprT21IrDuUPys2LmZeiYMjfkpJwgxzDWx255AhKVGfcx9OAuQyhoIcoyKhoNrQjPxeEwK1B89Zm9lAks8PFTJn0tDV6SgOOzgKJvN6XO58uT/Q/upOcXbMyhwHKW6jPXl3nSFnP0j/QI4CnQQxORIU9AudzwtTob/py4xQRPWCtGhjvb4cYvxVGjMK0py3LnrptCaARGcRsQMA11aOv7hOWJo/bMW9e9dxTxRPSKZua2LXeZHy08NFfTVKxRafz0dfKCiak8xMM8JaZMkekhIzJjxnMa4ZCp7mjsW/1QmD/1uph0r4BAqFGj4uEymUAjzu7QwtPXBB7Zmz7kNC29dx+uQAzBtRf2bE7Mw+jCp8Aav/Cvz15gphsgsaX22FzWuGokWbtTi9/xbMvenj2opX+fvs7GvJxSw4ZQlN8VS78yLlugMFz0fFmqYVFVrChBRFZZQpChaL9akh7aNeCANjpj3pw1wsGLO1TkCal5kg0Z3m6tG9cFu2QholLqg78OzIMxfU3oy3o6Fr0R3+4zmMsbovqG5NhWesTIFSth5uRTf8udzWjnrroLSh8Cf/+Am/PP/26qIgtXY5O6s7P4yVhXx+u/I8TLNa22vgArWSclkoJI06VLBXq9Wnup0lR0mK9qRCqYLL7hw0tHMM1WRGLD/W+R4k+TfWmQgimZTGI2T9YEYBfqgWh7TVQxDyJEHCREtJqB8kYx6HuVyyrziWoOQ2SrU3K3yzsaxBM/cHCdkzodT2gNuxHXNGM1JQjYoTM5TihGc4pmh+D3InQoE/wKP6TZWkfGgrkz3znoFa3QVu92bMGflilXN4JqsvpAFKXdlZBEPjYHc8gpcmus6VFdV3IG4KBPlypI9gkmoVV9onk6BR3Aq/5yT8vpc4z+MVSs1c3QPy4AfE4Xa+5PfR1pfDWfRnLJhwrMr25qz6LRNt7gpvCfD51sA86hUKnsum9msl5br91n5yjXyzz+MRbcsSe1LBzWFuT15xMJA8XrQn01YO45aHB2hP8miWOl4iKRXGw1DIf8+HugMBWQgFK4/i1VeZgFTuSst+DPqov8NTvAke//s8l4irT+Wu2ZmD+emTr/h7fJUfCJ2T+SF/j4KgWMJDjp4k2XYwm2lKpVE/sUENg2UT5IoTCAYYKgsOY1mSyZlSydYzmwWE+maRSCGS4G0EfDNZ53PiwWypX1xpqybAELscLutO7l36GObx4i7PnwlgzmgNqfIY/IGeSB+1s3L9jMc5ptl8UZ6DRLgSPu9ShuB43me5y5zRieu/OUywPsyXcw2TpgfA64nGnDFXViKb6AsohDcQlE4hJ1VcM24L82jxlOXGS8o1+wrnx8RHP1NUUPI5Q5HFOoMRDrtt3ZCU6KHhm3MyF4TfsvSxs+tISeC5tUa4PIcIYAGzkbhlIuCDJHAL0sefrtDmnOx7WOZZzB5+RYWHWVZodsZAAp8FX0EqFt5bcaNZWEohBxZJVFg1zlxJicKHVyiJr6Qq07If5HLrAj7I+HDTsz/ip5xVn6IwrBIrLi48k3UNy35OwmrCztUzmcyep30syYmjU1TRhBCTXCTyD5EfbFelei5xUvbAmdQHz195sCKeIRmxtsClvhuLhq6oFuunNqVCZ81BfmJfvNz9MB5d3wkxri9J8haVyPb052lQiitwQ7rV+dnVc8VaJeWa/bnbtTpjL1fY6y4pHmWKRkFB/qKRHeJK4pNpGZO5/WHPRcUnz6lv6Vh0sZdsDKvqa7NpWVP5Et9DKXRVlVjURMq0NROgFN7nHuCSg/9lUhV8wa4Q3L1hnnCyIvmzlvD/SfRgufQqkjKrP6XOChQKHSuRac6Ke6DQ/ofqgxJVIkAqV/MDAylULb0qLbeKS7kS5hakj+1c5fhLSTk0ccfotX1m7bOXFtLz7+u/nJ/yha3Xl+Nar7vqfz1f+lEfKJGwdmmJqS9eYrlrvnq26zfW7m+93/XZQbe13+jpt2Fhr62F3V9/v8+CASNbbqwQ/nvk+yfaZuYOXmXxtSwm2bcpFfuXun87Kcde1nE9E67W5jinGkmZteNkB7let5eFhCA3bImXSEw9JaXdVjBxeGp8/SVdlJEyKBlZI7nNmQ9x49kUeuUMm1Rx1UxKZj0F3oVH4EfsfQGqSfGxFqKrtaDSC5CW+RofdRuSf1gJKbOp+ujRWiSdqpCqdzKb6hWq0v6QKLlC5mH6lNWCPaoCfPCLzzjPyh5ONP/B8Xeocvx//KqlJMpxYPOQx0N99AcCjtKtcRoB2F6ULLv6q7/ptg+ZYu2ozQ35SEnxAbpL/xbb07LcRktH6cTN6drNN0y1t1JZQ1l5XaWTc6Zr9wydYtfL/CFvqWIW/zLI4Cl0yzTbPf30WXmDsXjvMHw2aGrRoOjDKOu7ViLVU4GwzAvBUyMpV+/PfzjKFPOKzVJ4rltBPJZXDFx6gt2Gdo3ZU0/jAcKkjPqROyBJyrHVb6EVJSVwP+3AkoTiX17TVwyCWp4NT35yZfW9LAky7Y+0m4ZRgn0Rrmr+OArmKkI8aVl38A18FTbapqIjMpvOgCD9J1z+Vlg0vqIcETOrBH6PPCT0x7xRW0rafZ3tVsywCt8vSXp5heNPqZ6UxYd2jvyDppvhELylXyaX8Um5AkokZb2DRT1ex0NdM2lCMaTrNSJRlU+fqaQ17ljGd4WpGP/tfHw3/EHEqW1Yd7YL7tz0NA6OmAKtzMePA5eUFUlg9/GT6jJuMmV0FJShqhXZeG9AOm5qtRneitZ8vT3q6hoSx+Px1iIpVx/IW2kwmMbZrSVhuZKguYq7ZZ1njNrY5EFX8DiW+rpEUqqjT9BRGI5ZI6o/enp2xu8olR6gh963yq7L7DlvXttKpAyTgo6CQpVO8q+lmDHA7z9OFf1gpbaWhfi9yOwVnHB7Oh3HaOO24fbgJDpHXSrZuWESZs2AVDGdL+ynLBcDn2cvVXQVjo6oviX/Yp/tqiVldPHRbUMeV/bUH4SzlJRiWR23Hr/+4zBM2/kIRrX4jpKzHe5ovRbPdHoHjlICaUjKHEsH3LLpOWy94T4kkpRrcrvi7i2zsW/I3RVIyS31mLXnXqw5fRWujtuD3UWtIRrAGQNnQS04z5G3vh5xbe2I/KIvXb2k/OSnkNZnyT2qUmnjfF7POaNFq2P+ZHHxN6M6mgbX1skF/S4mhmBAD8B2oMaVjKeXxfHxxGHh6KqltPg1XKipGrftrHblRXRaVFH9uQvzLIoMn+KlQdW/XOmfDKNzZILv7HpITPEolh+tNiBtXtOboZq+KHafgXB2bZXhMXHFSapsg2fHV/asRcAYWjK1PtRn7/DJH8doXS1cv1gA1hGlzYXJyMnvhVa6kxgWv5XPptS4ZHVqbzgCahx2tEVn/QE61gFYfRocdV6Brvy/lE51mVstli0OaPBtfg/ss6UgnhL3tlbruInUF94tXZUaDfElCatZsbJ4sTHxbIkSqRW2qCvdD98rbUysX/4q/1utpMzcnTtYpdN95WXeZDgUJLbLWsYoE2zWgiUjO8Tef0GkixS+IASc23GEkbd2rirC/6I0ZNYgo1QkIHNjRNVd6oOGCSflw1KTCKKUFfkiqn4V/+/4BSHEsuJvarEtkTi84WZ7ZbZqhQGL5GN9qb43SWhDyH2olIj06wxjmWQWi4D9MwQ9x86NRWocx0ghlZE1AyG/NXxQilTTv4S5YXaGEHTv5m+M7IiErk1SZu3LnWUwxc2zFhZUeGNoY8JeaJk+spNp0QWhHCl83giEdkPhcOOASo02VZGyUkMiu2qNo/xcS5RsYRKfb50w001QtkyHPP5ReM4sgPfELEa2tFCnZEKiaEuOFUJQpsB1eDwCti+gTs2EVEdlGqRQCxTBubcfBE1HaDqUugviIATG9PddiYBjR5intZIyY2/+GsYjRzjsPx+WJs5By+NY6PjcOq5bwofnjXKk4AUhUBMpSwVMiWQRfU4+W1Xr/yBQvI6hWS6qiUJIFI9lzowoBcurTgooVcqbCFg/hs+yooQIZRJUJEaZ+i03YvF3ecztJOQf6RB1gzf3BXiOmyGL6gNNx61wH5lAaZgF3ZVueH+aB3/Rcmg6fQ/nwesRdGyErpcbnpNPwnv2nyRuNPsLkLTi971cJOVg9lkW2anBply2O1enkoSoPjRhe7LsEgQBMrkMTqe3/83dYnMuCOlI4fNGoFpSkmiy6NspcXpTGq2huvxcdAygTHqe0uYb+AtX8rd2kGqvphRLopQqgi//NT5pf7icPOZOLmQlQx73KLxnzCTJYqpdBeSxUyjt2sBveR9B545qjEkuWpHtuh5nSf4lJOXTrKuGKnU1++vHLrj7hVLRuW8gVXRnWvXfwH10Evwcp66HOI7F/P+jYQxk0deRlOvh3NMFAefe8MslXjVKylX7838jlypyAvwIjmhPll3izkW/z+/1ub0dJvROPHbeKEcKXhACVZGyRFpNhKodY/95iymxulNCjWOMvgiaLjtIqHfgObGI0mwC1O2Xw5f3Ksn2INzH7qL0egeKhN9C1fYNSsflkEdP5P3JvL8UqjZm1vlTmJASaSyJcyvHKnozvxhyKQ20PfJJsFdJypkkMgMmKVmsp6EqVlPiRfH+79lHFu9/AJlxJMeXy3JJvD+VL8Gr4Xa1HG/QdwKu/bRFGQEou2ok5cd78n8fFR29uCw+WebkhHMo3e6zTGlIDa95R65LgkCVpKRKlmr7QHnFP8OkCbp2w3NqWgkpO2+lynyPpHyB5LsNisTnUbyjLbRdN1BSZcBzbCGJS2cjYINz953Q9SGJC0is04tJ3HG0Fc1U+Q5K3m8pQcWVYsaXqiClKJ90PfNI+H/AdTSdEnoKSf1fOPZ0ouTeD33vU7Qa/HDsbBPGRRyvqv2HlKjRcP6QjKA3n3ZmN453Fwk5EH77pnNSslZJuWJX/hKDKXqyrajwnCclVhIzzRmj3De2U2wXeuKXbcH+kjChETVaraQ03Uo7biI91l0k3lw49w+ibbgR2h4H4Ct8i+SbD0XLO6Fs9TJJaYKm2x6qdC5gHZtHcnAbf9TtYUmmTsmA+8QjJOC/SKw/0c7rRI3ogiL+D3DsSkLIy3SD8ral+KQpCVXtllP6jSa5rXAduoUq+yyl3q6w6RAgwRQtn6I0fJF9TKMZ0RnKxDn0zEfAffgmvhxfhu1cZdt/QBE7FcXbFWy03FJUber7o9252zRafe/wenfpwxJFqyYco7RuvLlLwqBG9Ax/dUOpTlIKKqZ0JjEjjjov6P4B3tNplHBu3ltIYlAqFmRAahxAm+0uSs1HeX8B72+ias5gFWPYIRJDN0HvCdqFr5HQX5M0A0kmc9juDNjX04n5CwXRL479DJNSTqkqrgWIRFJSMmbRudrF/gbTrLifEk9PZ2c1x/BaifPVbknYfnUff4B26kH2KzoxAsfwb/Z/hC/EwkpOVbXq+83Nthi91nVErlAa/Mw0P6fv+Y9wdpCtaPX4rvGjf3VMaEQTqsnRCYdzSj3sssBzhYB2aTA77JmXD3SXBblFKSO2UeqVl3nq59osdTqqguOc5y9KtbL6JeHGn3lC8pVdZUH1nz36kkBkeA5V9FMtKZd//1N/hVq9KSBufWDtsKQsjczqjdEkZcG747vQao5clwwBkZR2D37SxzG5uKrc+QuMS16ygdbUcF3GSLL5Od9K4dP3duZOjo6OXlLMJJcwH8t1bIiOAYPpr03oHl95rfiyzPzX2enWrZB3kGIJj4BPEBMUfp2zrDwrceGQW8C8lUj5wa68543Rpmk2C1dyyv0q/lMkpc1i+dst3WIj5042F6ZchnlWIuWy739aqYsyjaPtWMHJEeOVMQnxKDybu3hC94RHLsNYI102EwSqIuVOlVbX3eNylrNYQ1xeNNA+DgXcDtvdt3Zr8W4zwScyzcuAQAVSLjtcSPfac1imUMX4vSXnnYYzg0yxcNrs+z1FxfdPGpj07WUYZ6TLZoRABVL+d8upjhqlfI9MKghBngcgk8uhZRjIVVz8vq+4YOrEvsk/Z2c0I5AiU21YBCqQ8s0dJ683aIyfi6pbpeZ6Jn/1eDzTJ3WLjaSpNexzada9VSDl/3acvstgiFkqRkP9HrfF5XPddWePltnNGqHI5BscgQqkXLrj1PRW7RKfKzhlPVhkyb/lgatSqj+posGHGumwuSBQUVJuO/2WyqgdUHD64LVTr+l7YWf4NBfEIvO85AicI6W4a3bp9jNTj5yyLzeP7Rg5r/ySQx/poDoE/h9HD6tJCKxFyQAAAABJRU5ErkJggg==";
            //var imgData = "data:image/jpeg;base64,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";
            //var imgData = "data:image/jpeg;base64,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";

            //pdf.addImage(imgData, "PNG", 14, 28, 44, 18);
            pdf.addImage(imgData, 14, 28, 44, 18);

            console.log("image added to pdf");
            printText(rows); // print text data
            console.log("before callback");
            cbFunc($this.pdfOrder);
        } catch (err) {
            alert(JSON.stringify(err));
        }
    }, showErrors);
};

function loadImage(photoUrl, cbFunc, cbErr) {
    console.log("image chrome loading");
    var imgLogo = new Image();
    console.log("image created");
    imgLogo.onload = function() {
        console.log("imgLogo.complete: " + imgLogo.complete);
        console.log("imgLogo.width: " + imgLogo.width);
        console.log("imgLogo.height: " + imgLogo.height);
        console.log("imgLogo.naturalWidth: " + imgLogo.naturalWidth);
        console.log("imgLogo.naturalHeight: " + imgLogo.naturalHeight);
        var canvas = document.createElement('canvas');
        console.log("image canvas created");
        canvas.width = imgLogo.width;
        canvas.height = imgLogo.height;
        console.log("image size setted");
        var context = canvas.getContext('2d');
        context.drawImage(imgLogo, 0, 0, imgLogo.width, imgLogo.height);
        console.log("image context created and image drawn");
        var imgData = canvas.toDataURL('image/jpeg');
        console.log("image data: " + imgData);

        //cbFunc(imgData);
        cbFunc(canvas);
    };
    imgLogo.src = photoUrl;
    console.log("image order logo file: " + photoUrl);
}
diegocr commented 10 years ago

I'm nearly out of ideas, try using document.body.appendChild(canvas); after the .drawImage() call.

diegocr commented 10 years ago

Btw, did you tested if our live demos works there on Android?

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

Test the "Images" and "addHTML" examples.

jamesbrobb commented 10 years ago

I'm wondering if this issue may be related to endianness. The logic for png support was written on a mac (OSX 10.7.5), which is little endian.

You can use this gist to check the endianness of the andriod phone you're testing on.

diegocr commented 10 years ago

AFAICT, all ARM cpus are bi-endian, but the Android OS uses little-endian by default.

I think there are some weird limitations on the framework they're using, otherwise .toDataURL("image/jpeg") would return a proper JPEG.

jamesbrobb commented 10 years ago

Thanks Diego.

Yeah very true. Possibly a size limit on the returned data uri and it's being truncated, causing the image to corrupt when added to the PDF. If i remember correctly, there were size limitations on the early dataURL implementations for desktop browsers.

sebastianperrone commented 10 years ago

Thanks Diego and James for the info. Still have not been able to test the phonegap app on iOS, probably in the next few days I will. What I have been able to prove, is the page (http://mrrio.github.io/jsPDF) with the elementary jsPDF tests in iOS (iPad with iOS 7.1) and it worked perfectly; but with android did not work: android 2.2 show characters into iframe, android 3.2 did nothing, and android 4.2, in some devices proposed download the pdf file (and download ok), in the others did nothing too. When I get the results of phonegap on ios, I leave the result here.

pascalPimaia commented 10 years ago

I finaly could get a proper output and use it on android and iOS. The major difficulty was related to the encoding of the jsPDF.output function to save it into a file in the local file system.

Read this link it helped me to understand the problem: https://coderwall.com/p/nc8hia The solution is similar to the jsPDF.save function using Blob or ArrayBuffer. Warning Blobbuilder was not supported on my android device.

Here the code I used. The content is saved in buffer (ArrayBuffer class) before writing the file. In this example my class provides the pdf jsPDF.output by calling this.output() and PdfOutput is a global scope variable pointing ti this content.


PdfOutput   = this.output();    

if ( typeof window.requestFileSystem === "undefined") {
    alert("access to file system can only be performed on a real device : saving document for regular browser");
    //for debug on browser only 
    this.save(filename);        
    onSuccess && onSuccess();       
    return;
}
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, 
    // onRequestFileSystemReady
    function(fileSystem) 
    {
        getPdfDirectoryEntry(
            function(directoryEntry)
            {
                if(directoryEntry!==undefined)
                {
                    directoryEntry.getFile(filename, 
                    //fileSystem.root.getFile(filename, 
                        {create : true},
                        // onGetFileReady
                        function(entry)
                        {
                            // entry is a "file entry"
                            entry.createWriter(
                                // onWriterReady
                                function(writer) 
                                {
                                    writer.onwrite= onSuccess;
                                    writer.onerror= onError;                                                
                                        try
                                        {
                                            if( Blob )
                                            {
                                                // see https://coderwall.com/p/nc8hia
                                                var buffer = new ArrayBuffer(PdfOutput.length),
                                                    array = new Uint8Array(buffer);
                                                for (var i = 0; i < PdfOutput.length; i++) 
                                                {
                                                    array[i] = PdfOutput.charCodeAt(i);
                                                }                                           
                                                // see http://dev.w3.org/2006/webapi/FileAPI/#dfn-Blob
                                                writer.write(buffer);
                                            }
                                            else  
                                            {
                                                writer.write(PdfOutput); 
                                            }
                                        }
                                        catch(e)
                                        {
                                            onError(e);
                                        }                                                                               
                                },                              
                                onError //onWriterReady
                            );
                        },
                        onError //onGetFileReady
                    );//getFile(filename,
                }//if(directoryEntry !== undefined)
            },
            onError //onGetPdfDirectoryEntry
        );// getPdfDirectoryEntry
    },              
    onError //onRequestFileSystemError
);

writer is obtained using HTML5 createWriter() created from an entry the whole thing depending on requestFileSystem API.

diegocr commented 10 years ago

Thanks Pascal!

Well... let me digest that, there are two problems on cordova/phonegap:

I guess the first problem is the result of using the jspdf.js from the root of the repo, instead of one of the files available on the dist folder, because the jspdf.min.js file includes a Blob polyfill and therefore Blob should always be available, unless there's a problem with that polyfill, of course.

Moreover, the saveAs function we're using to save the PDF to disk comes from another shim/polyfill, FileSaver.js - This one already uses the FileSystem API (window.requestFileSystem) when it's available

So, can you please confirm which jsPDF were you using?

Then, there's the canvas problem, on the pointed link he's using window.canvasplugin instead, i think it's this one. Not much i can add here, if that thing were sync we could add it in addImage() as a workaround when it's available, so you guys will need to manually make use of it.

sebastianperrone commented 10 years ago

Thanks a lot Pascal! yes the key is the encoding. This data transformation that you posted, do the work:

var strPdf = pdf.output();
var buffer = new ArrayBuffer(strPdf.length);
var array = new Uint8Array(buffer);
for (var i = 0; i < strPdf.length; i++) {
    array[i] = strPdf.charCodeAt(i);
} 
writer.write(buffer);

With this add, is working fine on ios and android. Thanks a lot to all !

diegocr commented 10 years ago

Huh? so since you was using our latest version, that means none of the polyfills works there... but, the canvas element has a problem regardless i think... :confused:

Well, meh.

sebastianperrone commented 10 years ago

Yes I'm using your last version (v1.0.88), and the last posted loadImage function (passing the canvas object directly without image type). So yes, its very possible, that occurs that you say.

diegocr commented 10 years ago

Using 1.0.106 you can now do writer.write(pdf.output("arraybuffer"));

lvbeck commented 10 years ago

test on android 4.0.3 with jspdf-1.0.116 and window.canvasplugin, still not working.

also test jspdf 0.90, does not work with image either.

with 1.0.x version, I do like this: writer.write(doc.output("arraybuffer"));

with 0.9.0 version, I do like this: var output = doc.output(); var buffer = new ArrayBuffer(output.length); var array = new Uint8Array(buffer); for (var i = 0; i < output.length; i++) { array[i] = output.charCodeAt(i); }

writer.write( buffer );

here is the error log:

05-05 13:43:33.364: I/Web Console(12839): processMessage failed: Stack: TypeError: Function.prototype.apply: Arguments list has wrong type 05-05 13:43:33.364: I/Web Console(12839): at Function.APPLY_PREPARE (native) 05-05 13:43:33.364: I/Web Console(12839): at androidExec (file:///android_asset/www/scripts/libs/cordova/android/cordova.js:849:55) 05-05 13:43:33.364: I/Web Console(12839): at [object Object].write (file:///android_asset/www/scripts/libs/cordova/android/cordova.js:3103:5) 05-05 13:43:33.364: I/Web Console(12839): at file:///android_asset/www/scripts/controllers/ResultsCtrl.js:1177:28 05-05 13:43:33.364: I/Web Console(12839): at file:///android_asset/www/scripts/libs/cordova/android/cordova.js:2273:32 05-05 13:43:33.364: I/Web Console(12839): at file:///android_asset/www/scripts/libs/cordova/android/cordova.js:2287:9 05-05 13:43:33.364: I/Web Console(12839): at Object.callbackFromNative (file:///android_asset/www/scripts/libs/cordova/android/cordova.js:301:54) 05-05 13:43:33.364: I/Web Console(12839): at processMessage (file:///android_asset/www/scripts/libs/cordova/android/cordova.js:975:21) 05-05 13:43:33.364: I/Web Console(12839): at Function.processMessages (file:///android_asset/www/scripts/libs/cordova/android/cordova.js:1009:13) 05-05 13:43:33.364: I/Web Console(12839): at androidExec (file:///android_asset/www/scripts/libs/cordova/android/cordova.js:872:25) at file:///android_asset/www/scripts/libs/cordova/android/cordova.js:982

Originalin commented 10 years ago

I also have the above problem, can anyone solve it? I think it's the problem of cordova version

jonatasfreitasv commented 9 years ago

WOW its work @pascalPimaia !!!!!!!! THX A LOT MAN !!!

6trading commented 8 years ago

Thanks @pascalPimaia !!