{"id":7077,"date":"2024-03-25T10:00:07","date_gmt":"2024-03-25T13:00:07","guid":{"rendered":"https:\/\/www.bibliotecadigital.unicamp.br\/bd\/?page_id=7077"},"modified":"2025-06-18T15:31:59","modified_gmt":"2025-06-18T18:31:59","slug":"visualizar","status":"publish","type":"page","link":"https:\/\/www.bibliotecadigital.unicamp.br\/bd\/index.php\/visualizar\/","title":{"rendered":"Visualizar Documento"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"7077\" class=\"elementor elementor-7077\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-fa4f23a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"fa4f23a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a8b9a15\" data-id=\"a8b9a15\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b82f2cc elementor-widget elementor-widget-shortcode\" data-id=\"b82f2cc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><a href=\"https:\/\/www.bibliotecadigital.unicamp.br\/bd\">In\u00edcio<\/a><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3a626bf elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3a626bf\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-987622e\" data-id=\"987622e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-554c402\" data-id=\"554c402\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-96efff8 elementor-widget elementor-widget-shortcode\" data-id=\"96efff8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1be1872 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1be1872\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2d40ecb\" data-id=\"2d40ecb\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b25d603 elementor-widget elementor-widget-shortcode\" data-id=\"b25d603\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><!-- start Woody Code Snippets CSS and JS -->\n<style type=\"text\/css\">\n \/* CONTAINER PRINCIPAL DO DOCUMENTO *\/\r\n.doc-viewer-wrapper {\r\n    background-color: #f0e1e1;\r\n    border-radius: 8px;\r\n    box-shadow: 0 4px 15px rgba(0,0,0,0.05);\r\n    padding: 25px 30px;\r\n    border-left: 8px solid #bf2f03; \/* Identidade BDU *\/\r\n    margin-bottom: 30px;\r\n}\r\n\r\n.doc-viewer-title {\r\n   color: #333;\r\n   font-size: 1.5rem;\r\n   margin-top: 0;\r\n   margin-bottom: 20px;\r\n   line-height: 1.3;\r\n   font-weight: 700;\r\n}\r\n\r\n\r\n\/* BARRA DE FERRAMENTAS DO PDF (Substitui as divs inline antigas) *\/\r\n.pdf-toolbar {\r\n            display: flex;\r\n            justify-content: space-between;\r\n            align-items: center;\r\n            background-color: #f5f5f5;\r\n            padding: 12px 20px;\r\n            border-radius: 6px 6px 0 0;\r\n            border: 1px solid #ddd;\r\n            border-bottom: none;\r\n            flex-wrap: wrap;\r\n            gap: 15px;\r\n}\r\n\r\n        .pdf-nav-controls, .pdf-zoom-controls {\r\n            display: flex;\r\n            align-items: center;\r\n            gap: 10px;\r\n        }\r\n\r\n        \/* ESTILO DOS BOT\u00d5ES DA BARRA *\/\r\n        .pdf-toolbar button {\r\n            background-color: #555;\r\n            color: white;\r\n            border: none;\r\n            padding: 8px 14px;\r\n            border-radius: 4px;\r\n            cursor: pointer;\r\n            font-weight: 600;\r\n            font-size: 13px;\r\n            transition: background-color 0.3s;\r\n            display: inline-flex;\r\n            align-items: center;\r\n            gap: 6px;\r\n        }\r\n\r\n        .pdf-toolbar button:hover {\r\n            background-color: #333;\r\n        }\r\n\r\n        .pdf-toolbar button i {\r\n            font-size: 12px;\r\n        }\r\n\r\n        \/* INFORMA\u00c7\u00c3O DA P\u00c1GINA *\/\r\n        .page-info-wrapper {\r\n            display: flex;\r\n            align-items: center;\r\n            gap: 8px;\r\n            font-size: 14px;\r\n            color: #444;\r\n            font-weight: 600;\r\n            margin: 0 5px;\r\n        }\r\n\r\n        #page_current {\r\n           width: 50px !important;\r\n            padding: 6px !important;\r\n            margin: 0 !important;\r\n            border: 1px solid #ccc !important;\r\n            border-radius: 4px !important;\r\n            text-align: center !important;\r\n            font-weight: bold !important;\r\n            font-family: inherit !important;\r\n            font-size: 14px !important;\r\n            background-color: #fff !important;\r\n            color: #333 !important;\r\n            box-shadow: none !important;\r\n            -moz-appearance: textfield !important; \/* Remove setas no Firefox *\/\r\n        }\r\n        \r\n        \/* Remove setas do input number no Chrome\/Safari *\/\r\n        #page_current::-webkit-outer-spin-button,\r\n        #page_current::-webkit-inner-spin-button {\r\n            -webkit-appearance: none;\r\n            margin: 0;\r\n        }\r\n\r\n        #page_current:focus {\r\n            border-color: #bf2f03;\r\n            outline: none;\r\n            box-shadow: 0 0 0 2px rgba(191, 47, 3, 0.1);\r\n        }\r\n\r\n        #page-count {\r\n            color: #bf2f03;\r\n        }\r\n\r\n        \/* CONTAINER DO CANVAS (Substitui as dimens\u00f5es fixas antigas) *\/\r\n        #canvas_container {\r\n            width: 100%;\r\n            height: 75vh; \/* Altura responsiva (75% da altura da tela) *\/\r\n            min-height: 500px;\r\n            overflow: auto;\r\n            background-color: #525659; \/* Cor de fundo cl\u00e1ssica de leitores de PDF *\/\r\n            text-align: center;\r\n            border: 1px solid #ddd;\r\n            border-radius: 0 0 6px 6px;\r\n            padding: 20px;\r\n            box-sizing: border-box;\r\n            \/* Estiliza\u00e7\u00e3o da barra de rolagem *\/\r\n            scrollbar-width: thin;\r\n            scrollbar-color: #888 #525659;\r\n        }\r\n\r\n        \/* Estiliza\u00e7\u00e3o da barra de rolagem para Chrome\/Safari *\/\r\n        #canvas_container::-webkit-scrollbar { width: 10px; height: 10px; }\r\n        #canvas_container::-webkit-scrollbar-track { background: #525659; }\r\n        #canvas_container::-webkit-scrollbar-thumb { background: #888; border-radius: 5px; }\r\n        #canvas_container::-webkit-scrollbar-thumb:hover { background: #aaa; }\r\n\r\n        #pdf-canvas {\r\n            max-width: 100%;\r\n            box-shadow: 0 5px 25px rgba(0,0,0,0.3); \/* Sombra realista de p\u00e1gina *\/\r\n            margin: 0 auto;\r\n            background-color: white; \/* Garante que as p\u00e1ginas sem fundo carreguem brancas *\/\r\n        }\r\n\r\n        \/* RESPONSIVIDADE *\/\r\n        @media (max-width: 768px) {\r\n            .doc-viewer-wrapper {\r\n                padding: 20px 15px;\r\n            }\r\n            .pdf-toolbar {\r\n                flex-direction: column;\r\n                align-items: stretch;\r\n            }\r\n            .pdf-nav-controls {\r\n                justify-content: space-between;\r\n                width: 100%;\r\n            }\r\n            .pdf-zoom-controls {\r\n                justify-content: center;\r\n                width: 100%;\r\n                border-top: 1px solid #e0e0e0;\r\n                padding-top: 12px;\r\n            }\r\n            .page-info-wrapper span:first-child {\r\n                display: none; \/* Esconde a palavra \"P\u00e1gina\" no celular para poupar espa\u00e7o *\/\r\n            }\r\n        }\r\n\r\n\r\n<\/style>\n<!-- end Woody Code Snippets CSS and JS -->\n<article class=\"doc-viewer-wrapper\"><h5  style='padding-top: 10px'>Aparentemente n\u00e3o conseguimos encontrar o que voc\u00ea est\u00e1 procurando. Talvez uma nova busca ajude.<\/h5><\/article>\t\r\n<!-- Pass PHP variable to JS -->\r\n<script>\r\n  const originalUrl = <br \/>\n<b>Warning<\/b>:  Undefined variable $signedUrl in <b>\/var\/www\/html\/bd\/wp-content\/plugins\/insert-php\/includes\/shortcodes\/shortcode-php.php(64) : eval()'d code<\/b> on line <b>305<\/b><br \/>\nnull;\r\n<\/script>\r\n\r\n<!-- Biblioteca PDF.js -->\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.min.js\"><\/script>\r\n\r\n<script>\r\n    \/\/ Inicializa\u00e7\u00e3o do Worker\r\n    \/\/ \/\/ PDF de demonstra\u00e7\u00e3o p\u00fablico para garantir que o preview funcione no seu canvas\r\n    \/\/ No seu c\u00f3digo real do WordPress, voc\u00ea continuar\u00e1 usando a sua vari\u00e1vel \"proxyUrl\"\r\n    \/\/const proxyUrl = 'https:\/\/www.bibliotecadigital.unicamp.br\/document\/proxy-pdf.php?url=' + encodeURIComponent(originalUrl);\r\n  \/\/ Inicializa\u00e7\u00e3o do Worker\r\n    pdfjsLib.GlobalWorkerOptions.workerSrc = 'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.worker.min.js';\r\n\r\n      let pdfUrl = '';\r\n    \/\/ A vari\u00e1vel 'originalUrl' deve vir do seu script PHP\/WordPress acima deste c\u00f3digo\r\n    if (typeof originalUrl !== 'undefined' && originalUrl !== '') \r\n        pdfUrl = 'https:\/\/www.bibliotecadigital.unicamp.br\/document\/proxy-pdf.php?url=' + encodeURIComponent(originalUrl);\r\n\r\n\r\n    let pdfDoc = null;\r\n    let currentPage = 1;\r\n    let totalPages = 0;\r\n    let scale = 1.2;\r\n      \r\n    const canvas = document.getElementById('pdf-canvas');\r\n    const ctx = canvas.getContext('2d', { willReadFrequently: true });\r\n\r\n    \/\/ 2. USO DE ASYNC\/AWAIT: Evita que o getAnnotations quebre o page.render() com arquivos pesados do S3\r\n    async function renderPage(pageNum) {\r\n        try {\r\n            \/\/ Limpa a camada de links anterior para evitar ac\u00famulo\r\n            const annotationLayer = document.getElementById('annotation-layer');\r\n            annotationLayer.innerHTML = '';\r\n\r\n            \/\/ Busca a p\u00e1gina\r\n            const page = await pdfDoc.getPage(pageNum);\r\n            const viewport = page.getViewport({ scale });\r\n            \r\n            canvas.height = viewport.height;\r\n            canvas.width = viewport.width;\r\n\r\n            const wrapper = document.getElementById('pdf-wrapper');\r\n            wrapper.style.width = viewport.width + 'px';\r\n            wrapper.style.height = viewport.height + 'px';\r\n\r\n            const renderContext = {\r\n                canvasContext: ctx,\r\n                viewport: viewport\r\n            };\r\n\r\n            \/\/ Espera a renderiza\u00e7\u00e3o do Canvas terminar COMPLETAMENTE\r\n            await page.render(renderContext).promise;\r\n\r\n            \/\/ Depois do canvas pronto, tenta buscar as anota\u00e7\u00f5es (links) com tratamento de erro\r\n            try {\r\n                const annotations = await page.getAnnotations();\r\n                \r\n                \/\/ 1. Encontra links formatados oficialmente no PDF\r\n                annotations.forEach(annotation => {\r\n                    if (annotation.subtype === 'Link' && annotation.url) {\r\n                        const rect = viewport.convertToViewportRectangle(annotation.rect);\r\n                        const x = Math.min(rect[0], rect[2]);\r\n                        const y = Math.min(rect[1], rect[3]);\r\n                        const width = Math.abs(rect[0] - rect[2]);\r\n                        const height = Math.abs(rect[1] - rect[3]);\r\n\r\n                        criarLink(annotationLayer, annotation.url, x, y, width, height);\r\n                    }\r\n                });\r\n\r\n                \/\/ 2. NOVIDADE: Detetor de URLs em texto bruto (para links que n\u00e3o foram formatados)\r\n                const textContent = await page.getTextContent();\r\n                textContent.items.forEach(item => {\r\n                    const urlRegex = \/(https?:\\\/\\\/[^\\s]+|www\\.[^\\s]+)\/gi;\r\n                    const match = item.str.match(urlRegex);\r\n                    \r\n                    if (match) {\r\n                        match.forEach(url => {\r\n                            \/\/ Limpa pontua\u00e7\u00e3o acidental no fim do link (ex: www.site.com.)\r\n                            let cleanUrl = url.replace(\/[.,;)]$\/, '');\r\n                            \r\n                            \/\/ Converte a posi\u00e7\u00e3o do texto original para a posi\u00e7\u00e3o no ecr\u00e3\r\n                            const [viewportX, viewportY] = viewport.convertToViewportPoint(item.transform[4], item.transform[5]);\r\n                            const height = Math.abs(item.transform[3]) * scale * 1.3; \r\n                            const width = item.width * scale;\r\n                            \r\n                            const x = viewportX;\r\n                            const y = viewportY - (height * 0.8); \/\/ Ajuste da linha de base do texto\r\n\r\n                            let finalUrl = cleanUrl;\r\n                            if (!finalUrl.startsWith('http')) finalUrl = 'http:\/\/' + finalUrl;\r\n\r\n                            criarLink(annotationLayer, finalUrl, x, y, width, height);\r\n                        });\r\n                    }\r\n                });\r\n\r\n                \/\/ Fun\u00e7\u00e3o auxiliar para injetar a tag <a> na camada transparente\r\n                function criarLink(camada, url, x, y, w, h) {\r\n                    const a = document.createElement('a');\r\n                    a.href = url;\r\n                    a.target = '_blank';\r\n                    a.title = url;\r\n                    a.className = 'pdf-link';\r\n                    a.style.left = x + 'px';\r\n                    a.style.top = y + 'px';\r\n                    a.style.width = w + 'px';\r\n                    a.style.height = h + 'px';\r\n                    camada.appendChild(a);\r\n                }\r\n\r\n            } catch (annoErr) {\r\n                console.warn(\"Aviso: N\u00e3o foi poss\u00edvel extrair os links desta p\u00e1gina.\", annoErr);\r\n            }\r\n\r\n            document.getElementById('page_current').value = pageNum;\r\n            document.getElementById('page-count').textContent = totalPages;\r\n\r\n        } catch (err) {\r\n            console.error(\"Erro fatal ao renderizar a p\u00e1gina:\", err);\r\n        }\r\n    }\r\n     \r\n    function queueRenderPage(num) {\r\n        if (num >= 1 && num <= totalPages) {\r\n            currentPage = num;\r\n            renderPage(currentPage);\r\n        }\r\n    }\r\n\r\n    \/\/ 3. CARREGAR O PDF COM TRATAMENTO DE ERROS MELHORADO\r\n    pdfjsLib.getDocument(pdfUrl).promise.then(pdf => {\r\n        pdfDoc = pdf;\r\n        totalPages = pdf.numPages;\r\n        renderPage(currentPage);            \r\n    }).catch(err => {\r\n        console.error(\"Erro ao carregar o PDF do S3:\", err);\r\n        ctx.font = \"16px 'Open Sans'\";\r\n        ctx.fillStyle = \"#bf2f03\";\r\n        ctx.fillText(\"N\u00e3o foi poss\u00edvel carregar o documento do servidor.\", 20, 50);\r\n        ctx.fillText(\"Por favor, verifique a sua conex\u00e3o ou tente mais tarde.\", 20, 80);\r\n    });\r\n\r\n    \/\/ Eventos dos Bot\u00f5es\r\n    document.getElementById('prev-page').addEventListener('click', () => {\r\n        if (currentPage > 1) queueRenderPage(currentPage - 1);\r\n    });\r\n\r\n    document.getElementById('next-page').addEventListener('click', () => {\r\n        if (currentPage < totalPages) queueRenderPage(currentPage + 1);\r\n    });\r\n\r\n    document.getElementById('zoom-in').addEventListener('click', () => {\r\n        scale += 0.25;\r\n        renderPage(currentPage);\r\n    });\r\n\r\n    document.getElementById('zoom-out').addEventListener('click', () => {\r\n        if (scale > 0.5) {\r\n            scale -= 0.25;\r\n            renderPage(currentPage);\r\n        }\r\n    });\r\n\r\n    \/\/ Evento de digita\u00e7\u00e3o na caixa de n\u00famero de p\u00e1gina\r\n    document.getElementById('page_current').addEventListener('change', (e) => {\r\n        const pageNum = parseInt(e.target.value);\r\n        if (!isNaN(pageNum)) {\r\n            queueRenderPage(pageNum);\r\n        }\r\n    });\r\n<\/script>\r\n\t\r\n\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false,"footnotes":""},"instituto":[],"class_list":["post-7077","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.bibliotecadigital.unicamp.br\/bd\/index.php\/wp-json\/wp\/v2\/pages\/7077","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bibliotecadigital.unicamp.br\/bd\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.bibliotecadigital.unicamp.br\/bd\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.bibliotecadigital.unicamp.br\/bd\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bibliotecadigital.unicamp.br\/bd\/index.php\/wp-json\/wp\/v2\/comments?post=7077"}],"version-history":[{"count":21,"href":"https:\/\/www.bibliotecadigital.unicamp.br\/bd\/index.php\/wp-json\/wp\/v2\/pages\/7077\/revisions"}],"predecessor-version":[{"id":11981,"href":"https:\/\/www.bibliotecadigital.unicamp.br\/bd\/index.php\/wp-json\/wp\/v2\/pages\/7077\/revisions\/11981"}],"wp:attachment":[{"href":"https:\/\/www.bibliotecadigital.unicamp.br\/bd\/index.php\/wp-json\/wp\/v2\/media?parent=7077"}],"wp:term":[{"taxonomy":"instituto","embeddable":true,"href":"https:\/\/www.bibliotecadigital.unicamp.br\/bd\/index.php\/wp-json\/wp\/v2\/instituto?post=7077"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}