Недавно во время разработки и использования наших собственных продуктов мы получили отзывы о том, что веб-страницы, встроенные в Android, не могут открывать PDF-файлы, но IOS может его открывать. На самом деле, есть несколько ситуаций, когда Android невозможно открыть:
Встроенный движок Android WebView. В основном используется для отображения веб-контента и базового рендеринга текста. ограниченная поддержка рендеринга сложных мультимедиа и файлов определенных типов, Открытие предварительного просмотра больших PDF-файлов с суффиксом .pdf напрямую не поддерживается. 。 PDF-файлы без суффикса .pdf WebView по умолчанию обрабатывает их как обычные текстовые или двоичные файлы, поэтому их нельзя просмотреть напрямую.
WebView для IOS использует WebKit-движок , в движке есть встроенная поддержка PDF-файлов, Может напрямую просматривать и отображать содержимое PDF. . Таким образом, WebView на IOS может открывать файлы с суффиксом .pdf и предоставляет встроенную программу просмотра PDF-файлов, позволяющую пользователям просматривать PDF-файлы непосредственно в приложении. Для файлов без суффикса .pdf IOS все равно может просматривать и открывать их, поскольку функция предварительного просмотра системы IOS автоматически определяет тип файла и использует соответствующую программу предварительного просмотра для открытия файла. 。
Здесь я в основном сосредотачиваюсь на H5 без суффикса .pdf, используя Canvas и PDF.js, и даю решение во время разработки. Однако я также напишу здесь собранные мной решения для Android. Однако я не являюсь инженером-разработчиком Android, поэтому любые дополнения приветствуются.
<script src="https://unpkg.com/pdfjs-dist@1.9.426/build/pdf.min.js"></script>
<script>
// Получить параметры страницы
// Описание:?pdf=https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/web/compressed.tracemonkey-pldi-09.pdf
let url = new URLSearchParams(window.location.search).get("pdf");
let pdfDoc = null;
function createPage() {
let div = document.createElement("canvas");
document.body.appendChild(div);
return div;
}
function renderPage(num) {
pdfDoc.getPage(num).then(function (page) {
let viewport = page.getViewport(2.0);
let canvas = createPage();
let ctx = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
page.render({
canvasContext: ctx,
viewport: viewport
});
});
}
// Если это адрес внутренней ссылки на PDF-файл и требуется междоменная проверка файлов cookie, передайте его в getDocument { url: url, withCredentials: true }
PDFJS.getDocument({ url: url }).then(function (pdf) {
pdfDoc = pdf;
for (let i = 1; i <= pdfDoc.numPages; i++) {
renderPage(i)
}
})
</script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=4.0, user-scalable=no">
<title>АндроидPDFпрочитать страницу</title>
<style>
* {
margin: 0;
padding: 0;
}
canvas {
width: 100%;
height: 100%;
border: 1px solid rgb(221, 221, 221);
}
/* Загрузка стиля круга */
.spinner-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 2;
background-color: rgba(0, 0, 0, 0.3);
}
.spinner-box img {
width: 9.3333vw;
height: 9.3333vw;
}
.spinner-box .title {
margin: 2.6667vw 0 0;
font-size: 3.2vw;
color: #fff;
text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.5);
white-space: pre-line;
text-align: center;
}
.spinner-box .spinner {
width: 9.3333vw;
height: 9.3333vw;
animation: rotator 1.4s linear infinite;
}
@keyframes rotator {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(270deg);
}
}
.spinner-box .path {
stroke-dasharray: 187;
stroke-dashoffset: 0;
transform-origin: center;
animation: dash 1.4s ease-in-out infinite, colors 5.6s ease-in-out infinite;
}
@keyframes colors {
0% {
stroke: #fff;
}
25% {
stroke: #f7e7d7;
}
50% {
stroke: #eecfaf;
}
75% {
stroke: #e5b788;
}
100% {
stroke: #dd9f60;
}
}
@keyframes dash {
0% {
stroke-dashoffset: 187;
}
50% {
stroke-dashoffset: 46.75;
transform: rotate(135deg);
}
100% {
stroke-dashoffset: 187;
transform: rotate(450deg);
}
}
</style>
</head>
<script src="https://unpkg.com/pdfjs-dist@1.9.426/build/pdf.min.js"></script>
<body>
<div id="loading" class="spinner-box">
<!-- Загрузка -->
<svg class="spinner" viewBox="0 0 66 66" xmlns="http://www.w3.org/2000/svg">
<circle class="path" fill="none" stroke-width="6" stroke-linecap="round" cx="33" cy="33" r="30"></circle>
</svg>
</div>
<script>
// Получить параметры страницы
// Описание:?pdf=https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/web/compressed.tracemonkey-pldi-09.pdf
let url = new URLSearchParams(window.location.search).get("pdf");
let pdfDoc = null;
function createPage() {
let div = document.createElement("canvas");
document.body.appendChild(div);
return div;
}
function renderPage(num) {
pdfDoc.getPage(num).then(function (page) {
let viewport = page.getViewport(2.0);
let canvas = createPage();
let ctx = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
page.render({
canvasContext: ctx,
viewport: viewport
});
});
}
let loading = document.getElementById("loading")
// Показать загрузку
loading.style.display = "flex";
// Если это адрес внутренней ссылки на PDF-файл и требуется междоменная проверка файлов cookie, передайте его в getDocument { url: url, withCredentials: true }
PDFJS.getDocument({ url: url }).then(function (pdf) {
pdfDoc = pdf;
for (let i = 1; i <= pdfDoc.numPages; i++) {
renderPage(i)
}
// Скрыть загрузку
loading.style.display = "none";
})
</script>
</body>
</html>
Если есть какие-то недостатки, пожалуйста, поправьте меня.