pdf.js显示用tcpdf创建的文件的输出

时间:2014-07-21 19:12:02

标签: tcpdf pdf.js

我真的希望你能帮我解决这个问题。 我是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)
    })

1 个答案:

答案 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

中设置 DEFAULT_URL
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);
    }
})

希望这对您中的某些人有帮助! :)