我真的希望你能帮我解决这个问题。 我是pdf.js的新手,所以暂时我正在使用预建版本,看看我是否可以将它集成到我的网络应用程序中。
我的问题: 我使用tcpdf生成一个pdf文件,我希望使用pdf.js可视化,而不必将其保存到服务器上的文件中。
我有一个用于生成pdf的php文件(generate_document.php)。该文件以以下内容结尾:
$pdf->Output('test.pdf', 'I');
根据tcpdf文档,第二个参数可用于生成以下格式:
I: send the file inline to the browser (default). The plug-in is used if available. The name given by name is used when one selects the "Save as" option on the link generating the PDF.
D: send to the browser and force a file download with the name given by name.
F: save to a local server file with the name given by name.
S: return the document as a string (name is ignored).
FI: equivalent to F + I option
FD: equivalent to F + D option
E: return the document as base64 mime multi-part email attachment (RFC 2045)
然后,我想在不在服务器上创建文件的情况下使用pdf.js查看pdf(=不使用'F'作为第二个参数并将文件名传递给pdf.js)。
所以,我想我可以简单地创建一个iframe并调用指向php文件的pdf.js查看器:
<iframe width="100%" height="100%" src="/pdf.js_folder/web/viewer.html?file=get_document.php"></iframe>
然而,这根本不起作用....你知道我在忽视什么吗?或者这个选项在pdf.js中不可用?
我做了一些研究,我在这里看到了一些关于将base64流转换为类型化数组的帖子,但我不知道这将如何解决这个问题。
非常感谢你的帮助!!!
修改
@async,谢谢你的回答。
我在此期间弄清楚了,所以我想我会和你们分享我的解决方案。
1)在我的get_document.php中,我更改了输出语句,使用
将其直接转换为base64$pdf_output = base64_encode($pdf->Output('test_file.pdf', 'S'));
2)在viewer.js中,我使用XHR调用get_document.php并将返回值放入变量(pdf_from_XHR)
3)接下来,我使用其他一些帖子中提到的解决方案(例如Pdf.js and viewer.js. Pass a stream or blob to the viewer)
转换XHR请求中的内容pdf_converted = convertDataURIToBinary(pdf_from_XHR)
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;
}
etvoilà; - )
现在我可以将来自该函数的内容注入getDocument语句:
PDFJS.getDocument(pdf_converted).then(function (pdf) {
pdfDocument = pdf;
var url = URL.createObjectURL(blob);
PDFView.load(pdfDocument, 1.5)
})
答案 0 :(得分:0)
感谢编辑,即使我在解决方案方面遇到麻烦,也对我有很大帮助。
这是我输出base64字符串的方式:
// Output
echo base64_encode($pdf->Output(__DIR__ . $destpath, 'S'));
exit(); // Prevent the 0 added at the end of response
为什么?因为TCPDF在AJAX成功的响应末尾添加了0。
您仍然需要在viewer.js
var DEFAULT_URL = '';
加载您的 iframe ,以获取初始空pdfjs实例。
在成功实现AJAX的情况下,您应该按照以下步骤使用 iframe 中的PDFViewerApplication
打开PDF:
$.ajax({
url: ajaxurl,
type: 'POST',
data: {
action: 'preview_pdf',
fields: fields
},
success: function( data ) {
var pdfData = convertDataURIToBinary('data:application/pdf;base64,' + data);
var pdfjsframe = document.getElementById('pdfViewer');
pdfjsframe.contentWindow.PDFViewerApplication.open(pdfData);
},
error: function(err) {
console.log(err);
}
})
希望这对您中的某些人有帮助! :)