<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>PDF 转图片数组 Demo</title>
<style>
body {
font-family: Arial, sans-serif;
padding: 20px;
}
input[type="file"] {
margin-bottom: 20px;
}
</style>
</head>
<body>
<h2>上传 PDF 文件,转换为图片数组</h2>
<input type="file" id="pdfInput" accept="application/pdf" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.14.305/pdf.min.js"></script>
<script>
// 设置 worker 路径
pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.14.305/pdf.worker.min.js';
// 处理文件上传
document.getElementById('pdfInput').addEventListener('change', async function (event) {
const file = event.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = async function () {
const typedArray = new Uint8Array(reader.result);
try {
// 加载 PDF
const pdf = await pdfjsLib.getDocument({ data: typedArray }).promise;
const imagePromises = [];
// 遍历每一页
for (let i = 1; i <= pdf.numPages; i++) {
const page = await pdf.getPage(i);
// 设置视口(可调整 scale 提高清晰度)
const viewport = page.getViewport({ scale: 1.5 });
// 创建 canvas
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
// 渲染 PDF 页面到 canvas
await page.render({
canvasContext: context,
viewport: viewport
}).promise;
// 转换为图片 Data URL
const imageDataUrl = canvas.toDataURL('image/png');
// 将图片数据存入数组
imagePromises.push(imageDataUrl);
}
// 等待所有图片处理完成
const imageArray = await Promise.all(imagePromises);
// 打印到控制台
console.log('转换后的图片数组:', imageArray);
// 可选:显示图片
imageArray.forEach((imgUrl) => {
const img = document.createElement('img');
img.src = imgUrl;
img.style.maxWidth = '100%';
img.style.marginBottom = '10px';
document.body.appendChild(img);
});
} catch (error) {
console.error('PDF 转换失败:', error);
}
};
reader.onerror = function () {
console.error('文件读取失败:', reader.error);
};
reader.readAsArrayBuffer(file);
});
</script>
</body>
</html>