次のような base64 文字列から PDF を埋め込んでいます。
var pdfData = 'data:application/pdf;filename=MY_CUSTOM_FILENAME.pdf;base64,' +
'JVBERi0xLjcKCjEgMCBvYmogICUgZW50cnkgcG9pbnQKPDwKICAvVHlwZSAvQ2F0YWxvZwog' +
'IC9QYWdlcyAyIDAgUgo+PgplbmRvYmoKCjIgMCBvYmoKPDwKICAvVHlwZSAvUGFnZXMKICAv' +
'TWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCiAgL0NvdW50IDEKICAvS2lkcyBbIDMgMCBSIF0K' +
'Pj4KZW5kb2JqCgozIDAgb2JqCjw8CiAgL1R5cGUgL1BhZ2UKICAvUGFyZW50IDIgMCBSCiAg' +
'L1Jlc291cmNlcyA8PAogICAgL0ZvbnQgPDwKICAgICAgL0YxIDQgMCBSIAogICAgPj4KICA+' +
'PgogIC9Db250ZW50cyA1IDAgUgo+PgplbmRvYmoKCjQgMCBvYmoKPDwKICAvVHlwZSAvRm9u' +
'dAogIC9TdWJ0eXBlIC9UeXBlMQogIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KPj4KZW5kb2Jq' +
'Cgo1IDAgb2JqICAlIHBhZ2UgY29udGVudAo8PAogIC9MZW5ndGggNDQKPj4Kc3RyZWFtCkJU' +
'CjcwIDUwIFRECi9GMSAxMiBUZgooSGVsbG8sIHdvcmxkISkgVGoKRVQKZW5kc3RyZWFtCmVu' +
'ZG9iagoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDEwIDAwMDAwIG4g' +
'CjAwMDAwMDAwNzkgMDAwMDAgbiAKMDAwMDAwMDE3MyAwMDAwMCBuIAowMDAwMDAwMzAxIDAw' +
'MDAwIG4gCjAwMDAwMDAzODAgMDAwMDAgbiAKdHJhaWxlcgo8PAogIC9TaXplIDYKICAvUm9v' +
'dCAxIDAgUgo+PgpzdGFydHhyZWYKNDkyCiUlRU9G';
function loadPdf() {
var pdf= document.querySelector('.pdf')
var pobj = document.createElement('object')
pobj.className= "pdf_object"
pobj.setAttribute('data', pdfData)
pobj.setAttribute('type', 'application/pdf')
pdf.appendChild(pobj)
}
.pdf_object {
width: 100%;
height: 700px;
}
<div>
<button onclick="loadPdf();">
CLICK TO LOAD BELOW THE PDF
</button>
</div>
<div class="pdf"></div>
これは、Firefox と Chrome の両方で機能します。
私の問題は、pdf ダウンロード アクションのファイル名をカスタマイズできないことです。filename
パラメーター ( 'data:application/pdf;filename=MY_CUSTOM_FILENAME.pdf;...
) を使用していますが、無視されていることに注意してください。
Firefox では、次の警告が表示されます (関連するコードはこちら)。
「getPDFFileNameFromURL: パフォーマンス上の理由から、"data:" URL を無視します。」
また、pdf のファイル名はデフォルトですdocument.pdf
。
Chrome では警告は表示されませんが、ファイル名はデフォルトのままですdownload.pdf
。
では、どうすればファイル名をカスタマイズできますか? それは可能ですか?
私はこれらの方法を試しましたが、失敗しました:
基本的にこの投稿で行っていることを行うライブラリであるPDFObjectをチェックしました(これを書いているときに発見しました!)が、ファイル名のカスタマイズは許可されていないようです。
に pdf を読み込んで、
<iframe>
そのコンテンツを操作しようとしました。しかし、(少なくとも Firefox では) Cross Origin エラーが発生しますMozilla の PDF ビューアー ( PDF.js ) も
Content-Disposition
ヘッダーをチェックして、pdf のファイル名を推測しているようです。HTTPリクエストを何らかの方法でシミュレートし(base64文字列を使用しているため、常にブラウザーでローカルに)、それを使用してpdfビューアーをロードすることは可能でしょうか?
PDF.jsを直接使用することで解決できることはわかっていますが、可能であれば、この依存関係を避けたいと思います (また、コーディングも実装が簡単ではないため)。最後に、ファイル名をカスタマイズしたいだけです!
ありがとう!
編集: 以下のコード スニペットは Chrome では機能しません (「data:application/pdf;filename=MY_CUSTOM_FILENAME.pdf;base64,....」をプラグインとして読み込むことができませんでした。プラグインが読み込まれているフレームがサンドボックス化されているためです。 .) ですが、plan .html ファイルを開くと機能します。
編集 2: 解決策を見つけましたが、Firefox でのみ動作します。
ここで説明されbase64
ているように文字列をに変換し、これを Url に変換して、この URL にパラメーターを追加します (ここで説明されているように「#」を使用)。Blob
Blob
filename
したがって、loadPdf()
関数は次のとおりです。
function loadPdf() {
fetch(pdfData)
.then(res => res.blob())
.then(blob => {
try {
var blobUrl = URL.createObjectURL(blob)
// This line makes Chrome crash, we have to remove it there
// But it works on Firefox
blobUrl+= '#filename=MY_CUSTOM_FILENAME.pdf'
var pdf= document.querySelector('.pdf')
var pobj = document.createElement('object')
pobj.className= "pdf_object"
pobj.setAttribute('data', blobUrl)
pobj.setAttribute('type', 'application/pdf')
pdf.appendChild(pobj)
} catch(e) {
console.error(e)
}
})
}
Firefox の Pdf ビューアーからダウンロードすると、MY_CUSTOM_FILENAME.pdf が正常に表示されます。
しかし Chrome では、Blob URL のハッシュが表示されます。と:
- そのハッシュを変更することは不可能のようです
- インライン PDF をロードするために
<iframe>
( の代わりに)を使用しても、Chrome は. したがって、それを「ハッキング」する方法はありません。<object>
<embed>
この観点からの他のヒントはありますか?