使用PHP和jQuery将PDF打印到页面

因此,我在编写PHP脚本时需要一些帮助,该脚本通过PHP脚本在新选项卡中加载PDF.我这样做是为了确保只有在用户登录并有链接的情况下才能访问PDF,否则,父目录中的.htaccess会阻止PDF访问.
我可以使用以下代码从PDF中读取:

$file = '../path-to-file.pdf';
$filename = 'filename.pdf';
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
@readfile($file);

然后将其结果传递到下面显示的AJAX函数中,该函数生成一个新选项卡并将响应扔到它上:

$.ajax({
    url: '../includes/function.projects.php?view-media=' + item,
        success: function(data) {
            $(window.open().document.body).html(data);
        }
    })

所有这些都可以顺利进行,只有在打开新标签页时,因为我将响应直接写到了HTML文档中,所以屏幕上充满了这样的文本:

%PDF-1.5 %���� 2 0 obj << /Linearized 1 /L 17007 /H [ 687 126 ] /O 6 /E 16732 /N 1 /T 16731 >>

所以我的问题很简单:有人尝试过这样做吗?如果是这样,是否有我应该使用的库/我缺少的标题等
我已经在这里看到了这个问题,但是我无法获得人们列出的答案,因此我没有任何想法.任何帮助将不胜感激,谢谢!

解决方法:

是的,所以我有一个解决方案.如果有人可以提出更好的方法,请让我知道,但目前为止,这种方法非常有效!我找到了一个名为PDFObject的JS库,该库可用于制作跨浏览器的解决方案,以轻松地将PDF嵌入到html文档中.有了这个,我可以在服务器上传递一个PDF链接以及一个目标div,以便将其嵌入(在我的情况下,我已经在模式内部进行了设置,因此我们留在同一页面上).

因为我们停留在同一页面上,所以我可以使用我先前在项目中编写的功能来阻止对整个页面的访问,如果用户没有正确的访问级别,该功能会将用户重定向到索引.遵循以下方法行之有效:

function checkSession() {
    if(empty($_SESSION)) {
        header("Location: /?cheeky_monkey");
    }
}

如果用户尝试直接访问PDF,则htaccess中的此代码会将其阻止.仅当通过应用程序作为目标时,它才允许访问:

SetEnvIf Referer "localhost" is_local_referer
<FilesMatch "\.pdf$">
    Require env is_local_referer
</FilesMatch>

有了这种方式,所有需要做的就是在URL上添加一个URL,以便在单击PDF时加载该脚本标签,这是通过以下代码序列完成的:

  1. First we need to grab the URL for the PDF (you might be able to skip this step)

首先,每当有人单击以查看PDF时,就会调用此javascript(此调用只是嵌套为onclick属性):

function viewMedia(projectID, type, item) {
    $.ajax({
        url: '../includes/function.projects.php?cid=' + projectID + '&type=' + type + '&view-media=' + item,
        success: function(data) {
            $('.pdf-script').html('<script>PDFObject.embed("' + data + '", "#the-pdf");</script>');
            $('#viewMediaModal').modal('toggle');
        }
    })
}

这是在php页面上运行的代码.

public function viewMedia($item) {
    $mediaItems = unserialize($this->media);
    $file = '/path/to/pdf/' . $mediaItems[$item]['file'];
    echo $file;
}

从此函数返回的数据的示例:

/path/to/pdf/example-pdf.pdf
  1. Using this to load the PDF

一旦我们获得了正确的PDF网址,并且AJAX成功返回,就可以使用返回的数据重新生成JavaScript,这一次是使用新的PDF链接:

success: function(data) {
    $('.pdf-script').html('<script>PDFObject.embed("' + data + '", "#the-pdf");</script>');
    $('#viewMediaModal').modal('toggle');
}

该模态主体的结构如下所示:

<div class="modal-body">
    <div id="the-pdf"></div>
    <div class="pdf-script" style="display: none;">
        <script>PDFObject.embed('', '#the-pdf');</script>
    </div>
</div>
  1. The result

以上代码序列的结果将切换一个模态,如下所示:
使用PHP和jQuery将PDF打印到页面
并且如果用户尝试直接访问文件:
使用PHP和jQuery将PDF打印到页面

上一篇:PHP-使用htaccess清理URL会破坏我的CSS


下一篇:php-使用.htaccess的Apache文档根