123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>PDF查看器</title>
- <style>
- body, html {
- margin: 0;
- padding: 0;
- height: 100%;
- display: flex;
- flex-direction: column;
- font-family: Arial, sans-serif;
- }
- #toolbar {
- background-color: #333;
- color: #fff;
- padding: 10px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- border-bottom: 1px solid #555;
- }
- #toolbar button, #toolbar select {
- background-color: #444;
- color: #fff;
- border: none;
- padding: 5px 10px;
- margin: 0 5px;
- cursor: pointer;
- }
- #toolbar button:hover, #toolbar select:hover {
- background-color: #555;
- }
- #pdf-viewer-container {
- flex: 1;
- overflow-y: auto;
- padding: 10px;
- }
- #pdf-viewer {
- border: 1px solid #ccc;
- display: block;
- margin: 0 auto;
- }
- </style>
- <script src="pdf.min.js"></script>
- </head>
- <body>
- <div id="toolbar">
- <div>
- <select id="scale-select">
- <option value="0.5">50%</option>
- <option value="1">100%</option>
- <option value="1.5">150%</option>
- <option value="2">200%</option>
- </select>
- <button id="rotate-left">左旋</button>
- <button id="rotate-right">右旋</button>
- </div>
- </div>
- <div id="pdf-viewer-container">
- <canvas id="pdf-viewer"></canvas>
- </div>
- <script>
- // 解析URL参数
- function getQueryParam(param) {
- const urlParams = new URLSearchParams(window.location.search);
- return urlParams.get(param);
- }
- // 获取PDF URL参数,如果没有则使用默认URL
- const pdfurl = getQueryParam('file') || '/compressed.tracemonkey-pldi-09.pdf';
- const isShowTools = getQueryParam('isShowTools') || 'true';
- let pdfDoc = null;
- let scale = 1.5;
- let rotation = 0;
- async function loadPDF() {
- if(!isShowTools||isShowTools=="false")
- {
- document.getElementById('toolbar').style.display = 'none';
- }
- const loadingTask = pdfjsLib.getDocument(pdfurl);
- pdfDoc = await loadingTask.promise;
- renderAllPages();
- }
- async function renderAllPages() {
- const numPages = pdfDoc.numPages;
- const canvas = document.getElementById('pdf-viewer');
- const context = canvas.getContext('2d');
- let totalHeight = 0;
- let totalWidth = 0;
- for (let pageNumber = 1; pageNumber <= numPages; pageNumber++) {
- const page = await pdfDoc.getPage(pageNumber);
- const viewport = page.getViewport({ scale, rotation });
- totalHeight += viewport.height;
- totalWidth = Math.max(totalWidth, viewport.width);
- }
- canvas.height = totalHeight;
- canvas.width = totalWidth;
- let currentHeight = 0;
- for (let pageNumber = 1; pageNumber <= numPages; pageNumber++) {
- const page = await pdfDoc.getPage(pageNumber);
- const viewport = page.getViewport({ scale, rotation });
- const renderContext = {
- canvasContext: context,
- viewport: viewport
- };
- context.save();
- context.translate(0, currentHeight);
- await page.render(renderContext).promise;
- context.restore();
- currentHeight += viewport.height;
- }
- }
- document.getElementById('scale-select').addEventListener('change', (event) => {
- scale = parseFloat(event.target.value);
- renderAllPages();
- });
- document.getElementById('rotate-left').addEventListener('click', () => {
- rotation = (rotation - 90 + 360) % 360; // 确保旋转角度在0-359之间
- renderAllPages();
- });
- document.getElementById('rotate-right').addEventListener('click', () => {
- rotation = (rotation + 90) % 360; // 确保旋转角度在0-359之间
- renderAllPages();
- });
- document.addEventListener('DOMContentLoaded', function () {
- loadPDF();
- });
- </script>
- </body>
- </html>
|