Я пытаюсь просмотреть сгенерированный 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 {
... ...
Возможно, просто какая-то проблема конфигурации