I am creating a PDF document in a web application with jsPDF, sending this document to Perl and having a Perl email address and it works fine. However, when I add an image to a PDF, it no longer works, because Adobe Reader says the file is damaged. The application is huge, so there is a stub with the same corresponding code, which acts the same way:
HTML:
<!DOCTYPE html> <html> <head> <script src="https://<myserver>/js/jquery.js"></script> <script src="https://<myserver>/js/jspdf.js"></script> <script src="https://<myserver>/js/jspdf.plugin.addimage.js"></script> <script src="https://<myserver>/test/pdf.js"></script> </head> <body> <input type="submit" id="go"> </body> </html>
JS:
$(document).ready(function() { $('#go').on('click',function() { //create PDF var imgData = 'data:image/jpeg;base64,<dataurlencoded image string>'; var doc = new jsPDF('p','pt','a4'); doc.addImage(imgData, 'JPEG', 22, 22, 138, 28); doc.text(30, 120, 'Lorem Ipsum!'); var perl_pdf = doc.output(); //send PDF to perl and have perl email it $.ajax({ type: "POST", url: "https://<myserver>/cgi-bin/pdf.pl", contentType: "application/x-www-form-urlencoded; charset=UTF-8", dataType: "json", data: "perl_pdf="+encodeURIComponent(perl_pdf), error: function(XMLHttpRequest, textStatus, errorThrown) { alert("error: "+ XMLHttpRequest.responseText + ", textStatus: " + textStatus + ", errorThrown: " + errorThrown); }, success: function(data){ alert("Success: "+data.success); } }); }); });
Perl:
#!d:/perl/bin/perl.exe -w use strict; use warnings; use CGI qw(:all); use MIME::Lite; use MIME::Base64; my $q = CGI->new(); my $pdf_doc = $q->param('perl_pdf'); open (OUTFILE, '>pdf.pdf') or die "Could not open file"; binmode(OUTFILE); print OUTFILE decode_base64($pdf_doc); close OUTFILE; my $from_address = '<from_address>'; my $to_address = '<to_address>'; my $mail_host = '<smtp_server>'; my $subject = 'PDF Test'; my $message_body = "The PDF is attached...\n\n"; my $my_file = 'pdf.pdf'; my $out_file = 'test.pdf'; my $msg = MIME::Lite->new ( From => $from_address, To => $to_address, Subject => $subject, Type => 'multipart/mixed') or die "Cannot create multipart container: $!\n"; $msg->attach ( Type => 'TEXT', Data => $message_body) or die "Cannot attach text: $!\n"; $msg->attach ( Type => 'application/pdf', Path => $my_file, Filename => $out_file, Disposition => 'attachment') or die "Cannot attach file: $!\n"; MIME::Lite->send('smtp', $mail_host, Timeout=>60); $msg->send; my $json = qq{{"success" : "This worked"}}; print $q->header(-type => "application/json", -charset => "utf-8"); print $json;
If I replaced the Ajax call and created the output with ...
doc.output('dataurlnewwindow',{});
... then it displays correctly on a new browser tab, so I know that the image is inserted correctly. From what I found in my searches, this is apparently some encoding problem, but I have not yet found a solution to the problem. How can I get a PDF document with an image sent to Perl on the server successfully so that it is not damaged?