私はついにPDFView.open
メソッドを機能させました。ビューアを自分のページに埋め込み、Rob が最初の 2 つの例で提案したように open 関数を呼び出すと、機能します。
この種のソリューションを探している人のために、ここにいくつかのコード行を提供します。
これは私の Lightswitch mainPage.lsml.js のコードです。js スクリプト (pdf.js、viewer、およびその他) は、Lightswitch プロジェクト (Default.html) のメイン html ページで参照されます。Lightswitch ベースではない他の HTML ページでも動作するはずです。
myapp.MainPage.ShowPdf_execute = function (screen) {
// Write code here.
// Getting the stream from sql
var blob = new Blob([screen.WebReportsPdfFilesStream.selectedItem.Pdf], { type: "application/pdf;base64" });
// Pass the stream to an aspx page that makes some manipulations and returns a response
var formData = new FormData();
formData.tagName = pdfName;
formData.append(pdfName, blob);
var xhr = new XMLHttpRequest();
var url = "../OpenPdf.aspx";
xhr.open('POST', url, false);
xhr.onload = function (e) {
var response = e.target.response;
var pdfAsArray = convertDataURIToBinary("data:application/pdf;base64, " + response);
var pdfDocument;
// Use PDFJS to render a pdfDocument from pdf array
PDFJS.getDocument(pdfAsArray).then(function (pdf) {
pdfDocument = pdf;
var url = URL.createObjectURL(blob);
PDFView.load(pdfDocument, 1.5)
})
};
xhr.send(formData); // multipart/form-data
};
これがconvertDataURIToBinary
機能です
function convertDataURIToBinary(dataURI) {
var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
var base64 = dataURI.substring(base64Index);
var raw = window.atob(base64);
var rawLength = raw.length;
var array = new Uint8Array(new ArrayBuffer(rawLength));
for (i = 0; i < rawLength; i++) {
array[i] = raw.charCodeAt(i);
}
return array;
}
まだ見逃されているのは、ストリームをページに直接渡してviewer.html
新しいウィンドウで開き、レンダリングを行う別の UI を持つ可能性です。
内部にドキュメントがない空のビューアを取得したため、このコードはまだ機能していません。
var blob = new Blob([screen.WebReportsPdfFilesStream.selectedItem.Pdf], { type: "application/pdf;base64" });
var url = URL.createObjectURL(blob);
var viewerUrl = 'Scripts/pdfViewer/web/viewer.html?file=' + encodeURIComponent(url);
window.open(viewerUrl);
encodeURIComponent(url)
がビューアーにロードする適切なオブジェクトをビューアーに渡していないようです。アイデアや提案はありますか?