0

私の要件を分解しましょう。これが私が今していることです。

1. HTML から PDF ファイルを生成する

このために、次のように Weasyprint を使用しています。

lstFileNames = []
for i, content in enumerate(lstHtmlContent):
    repName = 'report'+ str(uuid.uuid4()) + '.pdf'
    lstFileNames.append("D:/Python/Workspace/" + repName)

    HTML(string=content).write_pdf(target=repName,
        stylesheets=[CSS(filename='/css/bootstrap.css')])

パスを含むすべてのファイル名は に保存されlstFileNamesます。

2. weasyprint で生成された pdf ファイルで zip ファイルを作成します

このために私はzipfileを使用しています

zipPath = 'reportDir' + str(uuid.uuid4()) + '.zip'
myzip = zipfile.ZipFile(zipPath, 'w') 
with  myzip:
    for f in lstFileNames:
        myzip.write(f)

3. zip ファイルをクライアントに送信してダウンロードする

resp = HttpResponse(myzip, content_type = "application/x-zip-compressed")

resp['Content-Disposition'] = 'attachment; filename=%s' % 'myzip.zip'

4. Javascript 経由でダウンロードするファイルを開く

var file = new Blob([response], {type: 'application/x-zip-compressed'});
var fileURL = URL.createObjectURL(file);
window.open(fileURL);

問題

1.フロント エンドで zip ファイルが正常に受信されているにもかかわらず、開こうとすると、次のエラーが表示されます。

アーカイブが不明な形式であるか、破損しています

ファイルを間違って送信していますか、それとも私の Javascript コードに問題がありますか?

2.すべてのpdfファイルをバイト配列のリストに保存し、それらのバイト配列でzipファイルを生成してクライアントに送信する方法はありますか? weasyprint で試してみましたが、結果は同じdamaged fileでした。

3.厳密には問題ではありませんが、weasyprint ドキュメントで見つけることができませんでした。ファイルを保存する場所へのパスを強制できますか?

問題 1 は最優先事項であり、残りは二次的なものです。私はそれを正しく行っているかどうか、つまりpdfファイルを生成してクライアントにzipファイルを送信しているかどうかを知りたいです。

前もって感謝します。

4

2 に答える 2

1

少し異なるアプローチは、zip ファイルをパブリック ディレクトリに移動し、その場所をクライアントに送信することです (例: json 形式)。

publicPath = os.path.join('public/', os.path.basename(zipPath))
os.rename(zipPath, os.path.join('/var/www/', publicPath))

jsonResp = '{ "zip-location": "' + publicPath + '" }'

resp = HttpResponse(jsonResp, content_type = 'application/json');

次に、クライアントの JavaScript で:

var res = JSON.parse(response);
var zipFileUrl = '/' + res['zip-location'];

window.open(zipFileUrl, '_blank');

'/' + res['zip-location']は、ページがディレクトリと同じフォルダーにあると想定していますpublic(したがって、ファイル システムhttp://example.com/public/pdf-files-123.zipを指します)。/var/www/public/pdf-files-123.zip

ディレクトリ内の 1 時間ほど前のすべてのファイルpublicを削除する cron ジョブを使用して、ディレクトリをクリーンアップできます。.zip

于 2016-09-30T08:27:26.217 に答える
0

ブロックを終了するとwith、ファイルハンドルは閉じられます。ファイルを再度開き (今回は open で) 、ファイルハンドル自体を渡す代わりに を使用read()して内容を渡す必要があります。HttpResponse

with zipfile.ZipFile(zipPath, 'w') as myzip
    for f in lstFileNames:
        myzip.write(f)
with open(zipPath, 'r') as myzip:
    return HttpResponse(myzip.read(), content_type = "application/x-zip-compressed")

それが機能するStringIO場合は、ファイルハンドルの代わりにインスタンスを使用して zip ファイルを保存できます。私はWeasyprintに詳しくないので、あなたがそれを使えるかどうかわかりませんStringIO.

于 2016-09-29T15:08:29.870 に答える