Closed pascalPimaia closed 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
Thx for the info In which context (operating system & browser type x version) was this PR used ?
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 ?
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);
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:
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");
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:
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.
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
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,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";
//var imgData = "data:image/png;base64,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";
//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);
}
I'm nearly out of ideas, try using document.body.appendChild(canvas);
after the .drawImage() call.
Btw, did you tested if our live demos works there on Android?
Test the "Images" and "addHTML" examples.
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.
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.
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.
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.
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.
Thanks Pascal!
Well... let me digest that, there are two problems on cordova/phonegap:
Blob
constructor is unavailable, having to deal with raw data.canvas.toDataURL
method is indeed broken.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.
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 !
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.
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.
Using 1.0.106 you can now do writer.write(pdf.output("arraybuffer"));
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
I also have the above problem, can anyone solve it? I think it's the problem of cordova version
WOW its work @pascalPimaia !!!!!!!! THX A LOT MAN !!!
Thanks @pascalPimaia !!
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