Skip to content

Instantly share code, notes, and snippets.

@hotsoft-desenv2
Last active February 12, 2025 23:11
Show Gist options
  • Select an option

  • Save hotsoft-desenv2/be32da749ebd1447c1fb10dd8f8c32c2 to your computer and use it in GitHub Desktop.

Select an option

Save hotsoft-desenv2/be32da749ebd1447c1fb10dd8f8c32c2 to your computer and use it in GitHub Desktop.

Revisions

  1. hotsoft-desenv2 revised this gist Feb 12, 2025. 1 changed file with 244 additions and 0 deletions.
    244 changes: 244 additions & 0 deletions 3.html
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,244 @@
    <div id="viewer-container" style="height: 100%; width: 100%; border: 0" class="w-100 h-100 border-0">
    <div id="download-link-container" style="display: none; text-align: center; margin-bottom: 10px;"></div>
    <iframe id="pdf-iframe" type="application/pdf" class="w-100 h-100 border-0"></iframe>
    <object id="pdf-viewer" type="application/pdf" class="d-none">
    <param id="base64-param" value="<%= @file_base64 %>">
    </object>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/jszip/dist/jszip.min.js" type="text/javascript"></script>
    <script src="https://cdn.jsdelivr.net/npm/fflate/umd/index.js" type="text/javascript"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pako/2.0.4/pako.min.js" type="text/javascript"></script>

    <script type="text/javascript">
    document.addEventListener('DOMContentLoaded', function () {
    var base64Data = document.getElementById('base64-param').getAttribute('value');
    var pdfIframe = document.getElementById('pdf-iframe');
    var laudoNumber = new URLSearchParams(window.location.search).get('laudo');
    var downloadContainer = document.getElementById('download-link-container');

    // Função para obter ou definir a última biblioteca bem-sucedida
    function getLastSuccessLibrary() {
    return localStorage.getItem('lastSuccessLibrary') || 'JSZip'; // Padrão para JSZip
    }

    function setLastSuccessLibrary(library) {
    localStorage.setItem('lastSuccessLibrary', library);
    }

    function isBase64PDF(base64) {
    return base64.startsWith('JVBERi0');
    }

    function base64ToArrayBuffer(base64) {
    var binaryString = window.atob(base64);
    var bytes = new Uint8Array(binaryString.length);
    for (var i = 0; i < binaryString.length; i++) {
    bytes[i] = binaryString.charCodeAt(i);
    }
    return bytes.buffer;
    }

    function blobToBase64(blob, callback) {
    var reader = new FileReader();
    reader.onload = function() {
    var base64Data = reader.result.split(',')[1];
    callback(base64Data);
    };
    reader.readAsDataURL(blob);
    }

    function processZipFile(data) {
    if (isBase64PDF(base64Data)) {
    var blob = new Blob([base64ToArrayBuffer(base64Data)], { type: 'application/pdf' });
    var fileUrl = URL.createObjectURL(blob);
    pdfIframe.src = fileUrl;
    console.log('PDF carregado diretamente.');
    } else {
    var dataArray = new Uint8Array(data);
    var libraries = ['JSZip', 'fflate', 'pako'];
    // Move a última biblioteca bem-sucedida para o início do array
    var lastSuccess = getLastSuccessLibrary();
    libraries = libraries.filter(lib => lib !== lastSuccess);
    libraries.unshift(lastSuccess);

    attemptUnzip(dataArray, libraries, function() {
    console.log("Processo de descompactação completo.");
    });
    }
    }

    function attemptUnzip(data, libraries, callback) {
    if (libraries.length === 0) {
    console.error("Nenhuma biblioteca de descompressão disponível.");
    return;
    }
    var library = libraries.shift();
    switch (library) {
    case 'JSZip':
    if (window.JSZip) {
    unzipWithJSZip(data, function(success) {
    if (!success && libraries.length > 0) {
    console.log('Tentativa com JSZip falhou, tentando outro método.');
    attemptUnzip(data, libraries, callback);
    } else {
    if (success) setLastSuccessLibrary('JSZip');
    if (callback) callback();
    }
    });
    } else {
    attemptUnzip(data, libraries, callback);
    }
    break;
    case 'fflate':
    if (window.fflate) {
    unzipWithFflate(data, function(success) {
    if (!success && libraries.length > 0) {
    console.log('Tentativa com fflate falhou, tentando outro método.');
    attemptUnzip(data, libraries, callback);
    } else {
    if (success) setLastSuccessLibrary('fflate');
    if (callback) callback();
    }
    });
    } else {
    attemptUnzip(data, libraries, callback);
    }
    break;
    case 'pako':
    if (window.pako) {
    unzipWithPako(data, function(success) {
    if (!success && libraries.length > 0) {
    console.log('Tentativa com pako falhou, tentando outro método.');
    attemptUnzip(data, libraries, callback);
    } else {
    if (success) setLastSuccessLibrary('pako');
    if (callback) callback();
    }
    });
    } else {
    attemptUnzip(data, libraries, callback);
    }
    break;
    }
    }

    function unzipWithJSZip(data, callback) {
    JSZip.loadAsync(data).then(function(zip) {
    var success = false;
    zip.forEach(function(relativePath, zipEntry) {
    zipEntry.async('blob').then(function(blob) {
    handleEntry(blob, relativePath);
    success = true;
    console.log('Arquivo ' + relativePath + ' processado com JSZip.');
    });
    });
    callback(success);
    }, function() {
    console.error('Erro ao descompactar com JSZip.');
    callback(false);
    });
    }

    function unzipWithFflate(data, callback) {
    fflate.unzip(data, function(err, unzipped) {
    if (err) {
    console.error('Erro ao descompactar com fflate:', err);
    callback(false);
    } else {
    var success = false;
    for (var key in unzipped) {
    if (unzipped.hasOwnProperty(key)) {
    handleEntry(new Blob([unzipped[key]], { type: 'application/pdf' }), key);
    success = true;
    console.log('Arquivo ' + key + ' processado com fflate.');
    }
    }
    callback(success);
    }
    });
    }

    function unzipWithPako(data, callback) {
    try {
    var inflated = pako.inflate(data);
    handleEntry(new Blob([inflated], { type: 'application/pdf' }), `Laudo_${laudoNumber}.pdf`);
    callback(true);
    console.log('Arquivo descompactado com Pako.');
    } catch (err) {
    console.error('Erro ao descompactar com Pako:', err);
    callback(false);
    }
    }

    function handleEntry(blob, filename) {
    if (blob.type === 'application/pdf' || filename.toLowerCase().endsWith('.pdf')) {
    // Ajuste específico para dispositivos móveis
    if (/Mobi|Android/i.test(navigator.userAgent)) {
    // Especialmente para Chrome Mobile, usamos base64
    if (navigator.userAgent.indexOf('Chrome') !== -1) {
    blobToBase64(blob, function(base64Pdf) {
    pdfIframe.src = 'data:application/pdf;base64,' + base64Pdf;
    // Nome do arquivo no iframe para dispositivos móveis
    pdfIframe.setAttribute('title', `Laudo_${laudoNumber}.pdf`);
    console.log('PDF carregado no iframe com base64 para Chrome Mobile.');
    });
    } else if (/iPhone|iPod|iPad/i.test(navigator.userAgent)) {
    var fileUrl = URL.createObjectURL(blob);
    pdfIframe.style.height = '100vh';
    pdfIframe.style.minHeight = '600px';
    pdfIframe.style.overflowY = 'auto';
    pdfIframe.src = fileUrl;
    // Nome do arquivo no iframe para iOS
    pdfIframe.setAttribute('title', `Laudo_${laudoNumber}.pdf`);
    console.log('PDF carregado no iframe com Blob para iPhone.');
    pdfIframe.onload = function() {
    URL.revokeObjectURL(fileUrl);
    };
    } else {
    // Para outros dispositivos móveis, tentamos com base64
    blobToBase64(blob, function(base64Pdf) {
    pdfIframe.src = 'data:application/pdf;base64,' + base64Pdf;
    // Nome do arquivo no iframe para outros dispositivos móveis
    pdfIframe.setAttribute('title', `Laudo_${laudoNumber}.pdf`);
    console.log('PDF carregado no iframe com base64 para dispositivos móveis.');
    });
    }
    } else {
    // Para dispositivos desktop, usamos Blob
    var fileUrl = URL.createObjectURL(blob);
    pdfIframe.src = fileUrl;
    // Nome do arquivo no iframe para desktop
    pdfIframe.setAttribute('title', `Laudo_${laudoNumber}.pdf`);
    console.log('PDF carregado no iframe com Blob para desktop.');
    pdfIframe.onload = function() {
    URL.revokeObjectURL(fileUrl);
    };
    }

    // Oferta de download para dispositivos móveis
    if (/Mobi|Android/i.test(navigator.userAgent)) {
    downloadContainer.innerHTML = '';

    var downloadLink = document.createElement('a');
    var currentUrl = new URL(window.location.href);
    currentUrl.searchParams.set('modo', 'baixar');
    downloadLink.href = currentUrl.href;
    downloadLink.download = `laudo_${laudoNumber}.zip`;
    downloadLink.textContent = 'Baixar ZIP';
    downloadContainer.style.display = 'block';
    downloadContainer.appendChild(downloadLink);

    var aviso = document.createElement('p');
    aviso.textContent = 'Para melhor visualização, baixe o ZIP contendo o PDF.';
    downloadContainer.appendChild(aviso);
    }
    } else {
    console.log('Arquivo não é PDF, ignorando para visualização direta.');
    }
    }

    var data = base64ToArrayBuffer(base64Data);
    processZipFile(data);
    });
    </script>
  2. hotsoft-desenv2 revised this gist Feb 12, 2025. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions 2.html
    Original file line number Diff line number Diff line change
    @@ -10,6 +10,7 @@
    <script src="https://cdn.jsdelivr.net/npm/fflate/umd/index.js" type="text/javascript"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pako/2.0.4/pako.min.js" type="text/javascript"></script>

    <script type="text/javascript">
    document.addEventListener('DOMContentLoaded', function () {
    var base64Data = document.getElementById('base64-param').getAttribute('value');
    var pdfIframe = document.getElementById('pdf-iframe');
  3. hotsoft-desenv2 revised this gist Feb 12, 2025. 1 changed file with 175 additions and 0 deletions.
    175 changes: 175 additions & 0 deletions 2.html
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,175 @@
    <div id="viewer-container" style="height: 100%; width: 100%; border: 0" class="w-100 h-100 border-0">
    <div id="download-link-container" style="display: none; text-align: center; margin-bottom: 10px;"></div>
    <iframe id="pdf-iframe" type="application/pdf" class="w-100 h-100 border-0"></iframe>
    <object id="pdf-viewer" type="application/pdf" class="d-none">
    <param id="base64-param" value="<%= @file_base64 %>">
    </object>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/jszip/dist/jszip.min.js" type="text/javascript"></script>
    <script src="https://cdn.jsdelivr.net/npm/fflate/umd/index.js" type="text/javascript"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pako/2.0.4/pako.min.js" type="text/javascript"></script>

    document.addEventListener('DOMContentLoaded', function () {
    var base64Data = document.getElementById('base64-param').getAttribute('value');
    var pdfIframe = document.getElementById('pdf-iframe');
    var laudoNumber = new URLSearchParams(window.location.search).get('laudo');
    var downloadContainer = document.getElementById('download-link-container');

    function isBase64PDF(base64) {
    return base64.startsWith('JVBERi0');
    }

    function base64ToArrayBuffer(base64) {
    var binaryString = window.atob(base64);
    var bytes = new Uint8Array(binaryString.length);
    for (var i = 0; i < binaryString.length; i++) {
    bytes[i] = binaryString.charCodeAt(i);
    }
    return bytes.buffer;
    }

    function processZipFile(data) {
    if (isBase64PDF(base64Data)) {
    pdfIframe.src = 'data:application/pdf;base64,' + base64Data;
    console.log('PDF carregado diretamente.');
    } else {
    var dataArray = new Uint8Array(data);
    attemptUnzip(dataArray, ['JSZip', 'fflate', 'pako'], function() {
    console.log("Processo de descompactação completo.");
    });
    }
    }

    function attemptUnzip(data, libraries, callback) {
    if (libraries.length === 0) {
    console.error("Nenhuma biblioteca de descompressão disponível.");
    return;
    }
    var library = libraries.shift();
    switch (library) {
    case 'JSZip':
    if (window.JSZip) {
    unzipWithJSZip(data, function(success) {
    if (!success && libraries.length > 0) {
    console.log('Tentativa com JSZip falhou, tentando outro método.');
    attemptUnzip(data, libraries, callback);
    } else if (callback) {
    callback();
    }
    });
    } else {
    attemptUnzip(data, libraries, callback);
    }
    break;
    case 'fflate':
    if (window.fflate) {
    unzipWithFflate(data, function(success) {
    if (!success && libraries.length > 0) {
    console.log('Tentativa com fflate falhou, tentando outro método.');
    attemptUnzip(data, libraries, callback);
    } else if (callback) {
    callback();
    }
    });
    } else {
    attemptUnzip(data, libraries, callback);
    }
    break;
    case 'pako':
    if (window.pako) {
    unzipWithPako(data, function(success) {
    if (!success && libraries.length > 0) {
    console.log('Tentativa com pako falhou, tentando outro método.');
    attemptUnzip(data, libraries, callback);
    } else if (callback) {
    callback();
    }
    });
    } else {
    attemptUnzip(data, libraries, callback);
    }
    break;
    }
    }

    function unzipWithJSZip(data, callback) {
    JSZip.loadAsync(data).then(function(zip) {
    var success = false;
    zip.forEach(function(relativePath, zipEntry) {
    zipEntry.async('blob').then(function(blob) {
    handleEntry(blob, relativePath);
    success = true;
    console.log('Arquivo ' + relativePath + ' processado com JSZip.');
    });
    });
    callback(success);
    }, function() {
    console.error('Erro ao descompactar com JSZip.');
    callback(false);
    });
    }

    function unzipWithFflate(data, callback) {
    fflate.unzip(data, function(err, unzipped) {
    if (err) {
    console.error('Erro ao descompactar com fflate:', err);
    callback(false);
    } else {
    var success = false;
    for (var key in unzipped) {
    if (unzipped.hasOwnProperty(key)) {
    handleEntry(new Blob([unzipped[key]]), key);
    success = true;
    console.log('Arquivo ' + key + ' processado com fflate.');
    }
    }
    callback(success);
    }
    });
    }

    function unzipWithPako(data, callback) {
    try {
    var inflated = pako.inflate(data);
    handleEntry(new Blob([inflated]), 'output.pdf'); // Assume que é um PDF descompactado
    callback(true);
    console.log('Arquivo descompactado com Pako.');
    } catch (err) {
    console.error('Erro ao descompactar com Pako:', err);
    callback(false);
    }
    }

    function handleEntry(blob, filename) {
    var fileUrl = URL.createObjectURL(blob);
    if (blob.type === 'application/pdf' || filename.toLowerCase().endsWith('.pdf')) {
    pdfIframe.src = fileUrl;
    console.log('PDF carregado no iframe com URL.createObjectURL.');

    // Se for um dispositivo móvel, oferece download mesmo para PDFs
    if (/Mobi|Android/i.test(navigator.userAgent)) {
    var downloadLink = document.createElement('a');
    downloadLink.href = fileUrl;
    downloadLink.download = filename;
    downloadLink.textContent = 'Baixar PDF';
    downloadContainer.style.display = 'block';
    downloadContainer.appendChild(downloadLink);

    var aviso = document.createElement('p');
    aviso.textContent = 'Para visualizar o PDF, por favor, baixe o arquivo.';
    downloadContainer.appendChild(aviso);
    }
    } else {
    console.log('Arquivo não é PDF, ignorando para visualização direta.');
    }
    // Revoga a URL após o carregamento do PDF no iframe
    pdfIframe.onload = function() {
    URL.revokeObjectURL(fileUrl);
    };
    }

    var data = base64ToArrayBuffer(base64Data);
    processZipFile(data);
    });
    </script>
  4. hotsoft-desenv2 created this gist Feb 12, 2025.
    177 changes: 177 additions & 0 deletions 1.html
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,177 @@
    <div id="viewer-container" style="height: 100%; width: 100%; border: 0" class="w-100 h-100 border-0">
    <div id="download-link-container" style="display: none; text-align: center; margin-bottom: 10px;"></div>
    <iframe id="pdf-iframe" type="application/pdf" class="w-100 h-100 border-0"></iframe>
    <object id="pdf-viewer" type="application/pdf" class="d-none">
    <param id="base64-param" value="<%= @file_base64 %>">
    </object>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/jszip/dist/jszip.min.js" type="text/javascript"></script>
    <script src="https://cdn.jsdelivr.net/npm/fflate/umd/index.js" type="text/javascript"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pako/2.0.4/pako.min.js" type="text/javascript"></script>

    <script>
    document.addEventListener('DOMContentLoaded', function () {
    var base64Data = document.getElementById('base64-param').getAttribute('value');
    var pdfIframe = document.getElementById('pdf-iframe');
    var laudoNumber = new URLSearchParams(window.location.search).get('laudo');
    var downloadContainer = document.getElementById('download-link-container');

    function isBase64PDF(base64) {
    return base64.startsWith('JVBERi0');
    }

    function base64ToArrayBuffer(base64) {
    var binaryString = window.atob(base64);
    var bytes = new Uint8Array(binaryString.length);
    for (var i = 0; i < binaryString.length; i++) {
    bytes[i] = binaryString.charCodeAt(i);
    }
    return bytes.buffer;
    }

    function processZipFile(data) {
    if (isBase64PDF(base64Data)) {
    pdfIframe.src = 'data:application/pdf;base64,' + base64Data;
    console.log('PDF carregado diretamente.');
    } else {
    var dataArray = new Uint8Array(data);
    attemptUnzip(dataArray, ['JSZip', 'fflate', 'pako'], function() {
    console.log("Processo de descompactação completo.");
    });
    }
    }

    function attemptUnzip(data, libraries, callback) {
    if (libraries.length === 0) {
    console.error("Nenhuma biblioteca de descompressão disponível.");
    return;
    }
    var library = libraries.shift();
    switch (library) {
    case 'JSZip':
    if (window.JSZip) {
    unzipWithJSZip(data, function(success) {
    if (!success && libraries.length > 0) {
    console.log('Tentativa com JSZip falhou, tentando outro método.');
    attemptUnzip(data, libraries, callback);
    } else if (callback) {
    callback();
    }
    });
    } else {
    attemptUnzip(data, libraries, callback);
    }
    break;
    case 'fflate':
    if (window.fflate) {
    unzipWithFflate(data, function(success) {
    if (!success && libraries.length > 0) {
    console.log('Tentativa com fflate falhou, tentando outro método.');
    attemptUnzip(data, libraries, callback);
    } else if (callback) {
    callback();
    }
    });
    } else {
    attemptUnzip(data, libraries, callback);
    }
    break;
    case 'pako':
    if (window.pako) {
    unzipWithPako(data, function(success) {
    if (!success && libraries.length > 0) {
    console.log('Tentativa com pako falhou, tentando outro método.');
    attemptUnzip(data, libraries, callback);
    } else if (callback) {
    callback();
    }
    });
    } else {
    attemptUnzip(data, libraries, callback);
    }
    break;
    }
    }

    function unzipWithJSZip(data, callback) {
    JSZip.loadAsync(data).then(function(zip) {
    var success = false;
    zip.forEach(function(relativePath, zipEntry) {
    zipEntry.async('blob').then(function(blob) {
    handleEntry(blob, relativePath);
    success = true;
    console.log('Arquivo ' + relativePath + ' processado com JSZip.');
    });
    });
    callback(success);
    }, function() {
    console.error('Erro ao descompactar com JSZip.');
    callback(false);
    });
    }

    function unzipWithFflate(data, callback) {
    fflate.unzip(data, function(err, unzipped) {
    if (err) {
    console.error('Erro ao descompactar com fflate:', err);
    callback(false);
    } else {
    var success = false;
    for (var key in unzipped) {
    if (unzipped.hasOwnProperty(key)) {
    handleEntry(new Blob([unzipped[key]]), key);
    success = true;
    console.log('Arquivo ' + key + ' processado com fflate.');
    }
    }
    callback(success);
    }
    });
    }

    function unzipWithPako(data, callback) {
    try {
    var inflated = pako.inflate(data);
    handleEntry(new Blob([inflated]), 'output.pdf'); // Assume que é um PDF descompactado
    callback(true);
    console.log('Arquivo descompactado com Pako.');
    } catch (err) {
    console.error('Erro ao descompactar com Pako:', err);
    callback(false);
    }
    }

    function handleEntry(blob, filename) {
    if (/Mobi|Android/i.test(navigator.userAgent)) {
    // Se for um dispositivo móvel, prioriza o download
    var downloadLink = document.createElement('a');
    downloadLink.href = URL.createObjectURL(blob);
    downloadLink.download = filename;
    downloadLink.textContent = 'Baixar PDF';
    downloadContainer.style.display = 'block';
    downloadContainer.appendChild(downloadLink);

    // Adiciona aviso para dispositivos móveis
    var aviso = document.createElement('p');
    aviso.textContent = 'Para visualizar o PDF, por favor, baixe o arquivo.';
    downloadContainer.appendChild(aviso);

    // Ainda tenta exibir no iframe, mas com prioridade para o download
    pdfIframe.src = URL.createObjectURL(blob);
    console.log('PDF carregado no iframe com URL.createObjectURL para visualização em dispositivo móvel.');
    } else {
    // Para desktops, tenta exibir diretamente no iframe
    if (blob.type === 'application/pdf' || filename.toLowerCase().endsWith('.pdf')) {
    pdfIframe.src = URL.createObjectURL(blob);
    console.log('PDF carregado no iframe com URL.createObjectURL.');
    } else {
    console.log('Arquivo não é PDF, ignorando para visualização direta.');
    }
    }
    }

    var data = base64ToArrayBuffer(base64Data);
    processZipFile(data);
    });
    </script>