Просмотр сгенерированного файла base64 PDf в формате pdf. js? - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь просмотреть сгенерированный PDF на странице, отображаемой в PHP. Файл PDF на самом деле не существует на сервере, поэтому для него нет URL-адреса. Проблема, с которой я сталкиваюсь, заключается в том, что средство просмотра FireFox работает (встроенный работает нормально), а Chrome - нет, поскольку использует URL-адрес, когда пользователь пытается загрузить файл, а URL-адрес не имеет к нему добавлено имя файла, поскольку файл недоступен через URL. В Firefox это работает, если я отправляю заголовки вроде:

header('Content-type:' . $mimetype); // application/pdf
header('Content-disposition: ' . $disposition . '; filename="'.$filename.'"');
header('content-Transfer-Encoding:binary');
header('Accept-Ranges:bytes');
readfile($targetfile);  // the path to the PDF, outside of server root.

Альтернатива, на которую я смотрю, - это использование библиотеки Mozilla pdf. js, чтобы средство просмотра Mozilla использовалось для всех браузеров, что было бы неплохо, потому что просмотрщик Mozilla хорош, и я воспользуюсь некоторыми другими возможностями, если буду использовать эту библиотеку.

Я посмотрел пару других постов на SO.

Как отобразить все страницы в формате PDF (сохраненном в base64) с использованием PDF. js?

pdf. js рендеринг в формате PDF с base64

Это не работает, нет PDF, но файлы js загружаются, и он просто отображает какой-то общий c код средства просмотра без PDF.

Файл средства просмотра. html в Интернете Каталог начинается с:

See https://github.com/adobe-type-tools/cmap-resources
-->
<html dir="ltr" mozdisallowselectionprint>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!--#if GENERIC || CHROME-->
    <meta name="google" content="notranslate">
<!--#endif-->
<!--#if GENERIC-->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--#endif-->
    <title>PDF.js viewer</title>

Это то, что я делаю, адаптировано из 1-й ссылки.

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">    
    <script src="/js/pdf.js-master/src/pdf.js"></script>
    <script src="/js/pdf.js-master/web/pdfjs.js"></script>
    <link src ="/js/pdf.js-master/web/viewer.css">
</head>
  <body>
    <iframe id="pdfFrame" style="width:900px;height:1000px;"></iframe>
    <script>
        function base64ToUint8Array(base64) {
            var raw = atob(base64);
            var uint8Array = new Uint8Array(raw.length);
            for (var i = 0; i < raw.length; i++) {
              uint8Array[i] = raw.charCodeAt(i);
            }
            return uint8Array;
          }
        var pdfData = base64ToUint8Array("<?php echo $output; ?>");
        var pdfViewerFrame = document.getElementById("pdfFrame");
        pdfViewerFrame.onload = function() {
            pdfViewerFrame.contentWindow.PDFViewerApplication.open(pdfData);
        }
        pdfViewerFrame.setAttribute("src","/js/pdf.js-master/web/pdf_viewer.js?file=");     
    </script>
  </body>
</html>

Любые предложения приветствуются. base_viewer. js находится в веб-папке в основном пакете, в том же каталоге, что и файл Viewer. html. Я не пробовал встраивать в объект или iframe, но у меня, вероятно, была бы та же проблема с потерянным именем файла, как в Chrome.

Когда я отправляю сообщение через контроллер, я получаю имя файла для использования из файл. Файл находится вне сети root, поэтому он создается динамически без URL.

$path_parts = pathinfo($targetfile);
$mimetype = self::getMimeType($path_parts['extension']);
$disposition = $_POST['disposition'];

По какой-то причине, когда вы просто визуализируете с заголовками:

header('Content-type:' . $mimetype);
header('Content-disposition: ' . $disposition . '; filename="'.$filename.'"');
header('content-Transfer-Encoding:binary');
header('Accept-Ranges:bytes');
readfile($targetfile);

Firefox сохраняет имя файла, но средство просмотра Chrome использует имя из URL-слага, которое не является URL-адресом реального PDF-файла. $ filename = $ path_parts ['basename'];

Это просто выдает ошибку:

/* Copyright 2014 Mozilla Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import { BaseViewer } from "./base_viewer.js";
import { shadow } from "pdfjs-lib";

class PDFViewer extends BaseViewer {

... ...

Возможно, просто какая-то проблема конфигурации

...