#javascript #html #pdf
#javascript #HTML #PDF
Вопрос:
У меня есть несколько файлов PDF, хранящихся на моем компьютере в моем локальном каталоге (C:/Users/…/…/Documents/file.pdf ). Мне нужно отобразить их в HTML5 и показать в браузере. Для достижения этой цели я использую PDF.js библиотека, но это работает только для URL-ссылок PDF-файлов, которые хранятся в Интернете, но не для тех, которые находятся в моем локальном каталоге. Ошибка, которую я получаю, гласит «Отсутствует PDF».
Я был бы очень признателен за вашу помощь.
Код:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.2.228/pdf.min.js"></script>
<style type="text/css">
#show-pdf-button {
width: 150px;
display: block;
margin: 20px auto;
}
#file-to-upload {
display: none;
}
#pdf-main-container {
width: 400px;
margin: 20px auto;
}
#pdf-loader {
display: none;
text-align: center;
color: #999999;
font-size: 13px;
line-height: 100px;
height: 100px;
}
#pdf-contents {
display: none;
}
#pdf-meta {
overflow: hidden;
margin: 0 0 20px 0;
}
#pdf-buttons {
float: left;
}
#page-count-container {
float: right;
}
#pdf-current-page {
display: inline;
}
#pdf-total-pages {
display: inline;
}
#pdf-canvas {
border: 1px solid rgba(0,0,0,0.2);
box-sizing: border-box;
}
#page-loader {
height: 100px;
line-height: 100px;
text-align: center;
display: none;
color: #999999;
font-size: 13px;
}
</style>
</head>
<body>
<button id="show-pdf-button">Show PDF</button>
<div id="pdf-main-container">
<div id="pdf-loader">Loading document ...</div>
<div id="pdf-contents">
<div id="pdf-meta">
<div id="pdf-buttons">
<button id="pdf-prev">Previous</button>
<button id="pdf-next">Next</button>
</div>
<div id="page-count-container">Page <div id="pdf-current-page"></div> of <div id="pdf-total-pages"></div></div>
</div>
<canvas id="pdf-canvas" width="400"></canvas>
<div id="page-loader">Loading page ...</div>
</div>
</div>
<script>
var _PDF_DOC,
_CURRENT_PAGE,
_TOTAL_PAGES,
_PAGE_RENDERING_IN_PROGRESS = 0,
_CANVAS = document.querySelector('#pdf-canvas');
// initialize and load the PDF
async function showPDF(pdf_url) {
document.querySelector("#pdf-loader").style.display = 'block';
// get handle of pdf document
try {
_PDF_DOC = await pdfjsLib.getDocument({ url: pdf_url });
}
catch(error) {
alert(error.message);
}
// total pages in pdf
_TOTAL_PAGES = _PDF_DOC.numPages;
// Hide the pdf loader and show pdf container
document.querySelector("#pdf-loader").style.display = 'none';
document.querySelector("#pdf-contents").style.display = 'block';
document.querySelector("#pdf-total-pages").innerHTML = _TOTAL_PAGES;
// show the first page
showPage(1);
}
// load and render specific page of the PDF
async function showPage(page_no) {
_PAGE_RENDERING_IN_PROGRESS = 1;
_CURRENT_PAGE = page_no;
// disable Previous amp; Next buttons while page is being loaded
document.querySelector("#pdf-next").disabled = true;
document.querySelector("#pdf-prev").disabled = true;
// while page is being rendered hide the canvas and show a loading message
document.querySelector("#pdf-canvas").style.display = 'none';
document.querySelector("#page-loader").style.display = 'block';
// update current page
document.querySelector("#pdf-current-page").innerHTML = page_no;
// get handle of page
try {
var page = await _PDF_DOC.getPage(page_no);
}
catch(error) {
alert(error.message);
}
// original width of the pdf page at scale 1
var pdf_original_width = page.getViewport(1).width;
// as the canvas is of a fixed width we need to adjust the scale of the viewport where page is rendered
var scale_required = _CANVAS.width / pdf_original_width;
// get viewport to render the page at required scale
var viewport = page.getViewport(scale_required);
// set canvas height same as viewport height
_CANVAS.height = viewport.height;
// setting page loader height for smooth experience
document.querySelector("#page-loader").style.height = _CANVAS.height 'px';
document.querySelector("#page-loader").style.lineHeight = _CANVAS.height 'px';
// page is rendered on <canvas> element
var render_context = {
canvasContext: _CANVAS.getContext('2d'),
viewport: viewport
};
// render the page contents in the canvas
try {
await page.render(render_context);
}
catch(error) {
alert(error.message);
}
_PAGE_RENDERING_IN_PROGRESS = 0;
// re-enable Previous amp; Next buttons
document.querySelector("#pdf-next").disabled = false;
document.querySelector("#pdf-prev").disabled = false;
// show the canvas and hide the page loader
document.querySelector("#pdf-canvas").style.display = 'block';
document.querySelector("#page-loader").style.display = 'none';
}
// click on "Show PDF" buuton
document.querySelector("#show-pdf-button").addEventListener('click', function() {
this.style.display = 'none';
showPDF('C:/Users/....../file.pdf');
});
// click on the "Previous" page button
document.querySelector("#pdf-prev").addEventListener('click', function() {
if(_CURRENT_PAGE != 1)
showPage(--_CURRENT_PAGE);
});
// click on the "Next" page button
document.querySelector("#pdf-next").addEventListener('click', function() {
if(_CURRENT_PAGE != _TOTAL_PAGES)
showPage( _CURRENT_PAGE);
});
</script>
</body>
</html>
Комментарии:
1. Утверждает ли эта библиотека, что предоставляет возможность отображения локальных PDF-файлов в браузере?
2. Кроме того, вы уверены, что правильно указали путь?
'C:/Users/....../file.pdf'
для меня это выглядит не совсем правильно.3. Да, я уверен, что нашел правильный путь, я просто удалил некоторые детали пути здесь для конфиденциальности 🙂 Но путь абсолютно правильный, и как только я вставляю его непосредственно в браузер, он отображает мой файл. Кроме того, я не нашел никакой информации о библиотеке, отображающей локальные PDF-файлы… Я пробовал использовать несколько других методов, таких как iframe, и это все еще не работает.
4.
C:/Users/....../file.pdf
это не URL. На локальный файл следует ссылаться с помощьюfile:
URI. Просто перетащите файл PDF в браузер, чтобы проверить правильный формат.5. Изменение ‘C:/Users/……/file.pdf ‘ to ‘file:///C:/Users/……/file.pdf’ не сработало. Я вижу ту же ошибку.