3

jsPDF を使用して Web アプリで PDF ドキュメントを作成し、そのドキュメントを Perl に送信し、Perl にメールで送信すると、正常に動作します。ただし、PDF ドキュメントに画像を追加すると、Adobe Reader がファイルが破損していると表示され、機能しなくなります。アプリは巨大なので、同じように動作する同様の関連コードを含むスタブを次に示します。

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);
            } 
       });
    });     
});

パール:

#!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;

Ajax の呼び出しと出力の作成を次のように置き換えると...

doc.output('dataurlnewwindow',{});    

...その後、新しいブラウザー タブに正しく表示されるので、画像が正しく挿入されていることがわかります。検索で見つけたものから、エンコードの問題のようですが、問題の解決策はまだ見つかりません. サーバー上の Perl に正常に送信された画像付きの PDF ドキュメントを取得して、破損しないようにするにはどうすればよいですか?

4

3 に答える 3

1

この問題は、最新バージョンの JSPDF で解決されています。xmlhttprequest.sendajax呼び出しを使用して、またはその一部として、画像付きのPDFをフォームデータとしてサーバーに送信する場合。

jsPDF.output('blob')の代わりに使用してくださいjsPDF.output()

これにより、サーバーに送信するときに pdf が破損することはありません。

于 2015-09-16T14:57:05.207 に答える
0

OK、これはおそらく役に立たないでしょう.

次のように呼び出される私のテストperlスクリプトapp.pl

#!/usr/bin/env perl
use strict;
use warnings;
use CGI qw(:all);

my $q = CGI->new();
my $pdf_doc = $q->param('perl_pdf');

open (my $fp, '>', 'pdf.pdf') or die "Could not open file";
print $fp $pdf_doc;
close $fp;
print "OK\n";

という名前の pdf ファイルを用意しますx.pdf

$ ls -l x.pdf
-rw-r--r--@ 1 jm  staff  100838 18 mar 19:20 x.pdf

ポート 3000 で簡単なテスト Web サーバーを実行する

plackup --port 3000 -MPlack::App::WrapCGI -e 'Plack::App::WrapCGI->new( script => "./app.pl", execute => 1)->to_app'

言います:

HTTP::Server::PSGI: Accepting connections at http://0:3000/

curlコマンドを介してbase64でエンコードされたファイルを送信する別の端末から

$ curl -i -F perl_pdf="$(base64 < x.pdf)" 0:3000/

応答:

HTTP/1.0 200 OK
Date: Tue, 18 Mar 2014 20:15:40 GMT
Server: HTTP::Server::PSGI
Content-Length: 3

OK

サーバーは言う:

127.0.0.1 - - [18/Mar/2014:21:06:00 +0100] "POST / HTTP/1.1" 200 3 "-" "curl/7.35.0"

ファイルを保存しましたpdf.pdfファイルにはbase64でエンコードされたコンテンツが含まれています。

$ ls -la pdf.pdf
-rw-r--r--  1 jm  staff  134452 18 mar 21:06 pdf.pdf

解読する

$ base64 -D < pdf.pdf >decoded.pdf

そしてオリジナルと比較

$ cmp decoded.pdf x.pdf
$ ls -la decoded.pdf 
-rw-r--r--  1 jm  staff  100838 18 mar 21:18 decoded.pdf

違いはありません-pdfを送信します-成功しました。

残念ながら、次の理由により、これ以上は役に立ちません。

  • Windows を使用しています
  • そして私はJavascriptを知りません...

確認することを検討してください:

于 2014-03-18T20:16:47.343 に答える
0

問題が見つかりました。画像を PDF に追加する前に、Perl へのファイルの送信は、文字列の送信で失われた (または適切な) バイナリ情報がなかったため、エンコードなしで機能していました。もちろん、画像を追加すると、非常に適切なバイナリ情報が文字列に追加され、urlencoded メッセージでは送信できませんでした。エンコード/デコードでこれを処理する必要がありましたが...

さまざまな Base64 エンコーディング/デコーディング方法を試しましたが、それでもファイルが壊れてしまいました。最後に、URL の一部として文字列を送信すると + 記号がスペースに変換されると述べた同様の問題に出くわしました。エンコードされた文字列がどのように見えるかを確認するために、Perl 側のデコードを削除しましたが、実際には文字列全体にいくつかのスペースがありました。これらを元に戻す

$pdf_doc =~ s/ /+/g;

Perl がファイルに書き込む前に、問題を修正しました。ファイルは、サーバー側の Adob​​e で取得できるようになりました。

于 2014-03-20T16:36:24.220 に答える