使用PHP&amp ;;将PDF打印到页面jQuery的

时间:2018-06-11 20:22:31

标签: php jquery ajax .htaccess pdf

所以我需要一些关于我正在编写的PHP脚本的帮助,它通过PHP脚本在新选项卡中加载PDF。我这样做是为了确保只有用户登录并且有链接才能访问PDF,否则PDF目录的父目录中的.htaccess会阻止访问。
我可以使用以下代码从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 >>

所以我的问题很简单;有没有人试过设法做到这一点?如果是的话,是否有我应该使用的库/标题我没有等等。

我已经在这里看到了这个问题,但我无法得到人们列出来的答案,所以我没有想法。

任何帮助都将不胜感激,提前致谢!

1 个答案:

答案 0 :(得分:3)

是的,所以我有一个解决方案。如果有人可以提出更好的方法,请告诉我,但现在这完美!我找到了一个名为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,以便在点击PDF时加载,通过以下代码序列完成:

  
      
  1. 首先,我们需要获取PDF的URL(您可能可以跳过此步骤)
  2.   

首先,只要有人点击查看PDF(此调用只是嵌套为onclick属性),就会调用此javascript:

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. 使用此方法加载PDF
  2.   

一旦我们获得了PDF的正确URL并且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. 结果
  2.   

上述代码序列的结果切换了如下所示的模态:

enter image description here

如果用户试图直接访问文件:

enter image description here