<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivos pdf to excel - Web-Zoneware</title>
	<atom:link href="https://webzoneware.com/tag/pdf-to-excel/feed/" rel="self" type="application/rss+xml" />
	<link>https://webzoneware.com/tag/pdf-to-excel/</link>
	<description>Mais do que apenas uma academia web.</description>
	<lastBuildDate>Thu, 22 Oct 2026 17:25:51 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://webzoneware.com/wp-content/uploads/icon-webzoneware-150x150.png</url>
	<title>Arquivos pdf to excel - Web-Zoneware</title>
	<link>https://webzoneware.com/tag/pdf-to-excel/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Conversor de PDF para Excel Online Grátis &#124; Web-ZoneWare</title>
		<link>https://webzoneware.com/web-ferramentas/pdf/conversor-de-pdf-para-excel/</link>
					<comments>https://webzoneware.com/web-ferramentas/pdf/conversor-de-pdf-para-excel/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Fri, 16 Oct 2026 19:17:49 +0000</pubDate>
				<category><![CDATA[PDF & Documentos]]></category>
		<category><![CDATA[converter pdf em xlsx]]></category>
		<category><![CDATA[extrair tabela de pdf para excel]]></category>
		<category><![CDATA[pdf to excel]]></category>
		<category><![CDATA[transformar pdf em planilha]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=28984</guid>

					<description><![CDATA[<p>O Conversor de PDF para Excel Online do Web-ZoneWare foi desenvolvido para economizar horas de digitação manual de estudantes, contadores, analistas de dados e programadores. Transforme tabelas de demonstrativos contábeis, notas fiscais, faturas de cartão e extratos bancários em planilhas editáveis no formato Microsoft Excel (.xlsx) ou .csv. Utilizando o algoritmo de agregação espacial de [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-ferramentas/pdf/conversor-de-pdf-para-excel/">Conversor de PDF para Excel Online Grátis | Web-ZoneWare</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>O <strong>Conversor de PDF para Excel Online</strong> do Web-ZoneWare foi desenvolvido para economizar horas de digitação manual de estudantes, contadores, analistas de dados e programadores. Transforme tabelas de demonstrativos contábeis, notas fiscais, faturas de cartão e extratos bancários em planilhas editáveis no formato Microsoft Excel (<code>.xlsx</code>) ou <code>.csv</code>.</p>
<p>Utilizando o algoritmo de agregação espacial de texto suportado pelo <a href="https://mozilla.github.io/pdf.js/" target="_blank" rel="noopener noreferrer">PDF.js da Mozilla</a> e a biblioteca <a href="https://sheetjs.com/" target="_blank" rel="noopener noreferrer">SheetJS</a>, a ferramenta agrupa automaticamente os caracteres por linhas e colunas conforme a posição original na página.</p>
    <div id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa" class="wzw-tool-container wzw-pdf-suite-wrapper">
        <style>
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa {
                background: linear-gradient(145deg, #0f172a 0%, #1e293b 100%);
                color: #f8fafc;
                border-radius: 16px;
                padding: 24px;
                box-shadow: 0 12px 35px rgba(0, 0, 0, 0.35);
                border: 1px solid #334155;
                font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
                margin: 20px 0 35px 0;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa * {
                box-sizing: border-box;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-tool-header {
                display: flex;
                align-items: center;
                justify-content: space-between;
                flex-wrap: wrap;
                gap: 12px;
                margin-bottom: 20px;
                padding-bottom: 16px;
                border-bottom: 1px solid rgba(255, 255, 255, 0.1);
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-tool-title {
                margin: 0;
                font-size: 1.35rem;
                font-weight: 800;
                color: #10b981;
                display: flex;
                align-items: center;
                gap: 10px;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-badge-client {
                background: rgba(16, 185, 129, 0.15);
                color: #34d399;
                border: 1px solid rgba(16, 185, 129, 0.35);
                padding: 4px 10px;
                border-radius: 20px;
                font-size: 11px;
                font-weight: 700;
                text-transform: uppercase;
                letter-spacing: 0.5px;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-dropzone {
                border: 2px dashed #059669;
                background: rgba(5, 150, 105, 0.05);
                border-radius: 14px;
                padding: 44px 20px;
                text-align: center;
                cursor: pointer;
                transition: all 0.25s ease;
                margin-bottom: 20px;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-dropzone:hover,
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-dropzone.drag-over {
                background: rgba(5, 150, 105, 0.12);
                border-color: #34d399;
                transform: translateY(-2px);
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-drop-icon {
                font-size: 48px;
                margin-bottom: 12px;
                display: block;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-drop-title {
                font-size: 1.15rem;
                font-weight: 700;
                color: #f1f5f9;
                margin: 0 0 6px 0;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-drop-sub {
                font-size: 13px;
                color: #94a3b8;
                margin: 0;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-workspace {
                display: none;
                background: rgba(15, 23, 42, 0.6);
                border-radius: 14px;
                padding: 20px;
                border: 1px solid #334155;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-file-summary {
                display: flex;
                align-items: center;
                justify-content: space-between;
                background: #1e293b;
                border: 1px solid #475569;
                border-radius: 10px;
                padding: 12px 18px;
                margin-bottom: 20px;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-file-meta {
                display: flex;
                align-items: center;
                gap: 12px;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-file-icon {
                font-size: 28px;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-file-details strong {
                display: block;
                font-size: 14px;
                color: #f8fafc;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-file-details span {
                font-size: 12px;
                color: #94a3b8;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-btn-outline {
                background: transparent;
                border: 1px solid #64748b;
                color: #cbd5e1;
                border-radius: 8px;
                padding: 6px 14px;
                font-size: 12px;
                font-weight: 600;
                cursor: pointer;
                transition: all 0.2s;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-btn-outline:hover {
                border-color: #34d399;
                color: #34d399;
                background: rgba(16, 185, 129, 0.1);
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-config-grid {
                display: grid;
                grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
                gap: 14px;
                background: rgba(15, 23, 42, 0.4);
                padding: 16px;
                border-radius: 10px;
                border: 1px solid #334155;
                margin-bottom: 20px;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-form-label {
                display: block;
                font-size: 13px;
                font-weight: 600;
                color: #cbd5e1;
                margin-bottom: 6px;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-select,
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-input-text {
                width: 100%;
                background: #0f172a;
                border: 1px solid #475569;
                border-radius: 8px;
                padding: 9px 12px;
                color: #f8fafc;
                font-size: 13px;
                outline: none;
                transition: border 0.2s;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-select:focus,
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-input-text:focus {
                border-color: #34d399;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-table-preview-card {
                background: #0f172a;
                border: 1px solid #334155;
                border-radius: 10px;
                padding: 16px;
                max-height: 380px;
                overflow: auto;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-excel-grid {
                width: 100%;
                border-collapse: collapse;
                font-size: 12px;
                font-family: monospace;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-excel-grid th {
                background: #1e293b;
                color: #34d399;
                padding: 8px 12px;
                border: 1px solid #334155;
                text-align: left;
                position: sticky;
                top: 0;
                z-index: 2;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-excel-grid td {
                padding: 6px 12px;
                border: 1px solid #334155;
                color: #e2e8f0;
                white-space: nowrap;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-excel-grid tr:nth-child(even) td {
                background: rgba(30, 41, 59, 0.4);
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-action-bar {
                display: flex;
                align-items: center;
                justify-content: space-between;
                flex-wrap: wrap;
                gap: 14px;
                margin-top: 20px;
                padding-top: 18px;
                border-top: 1px solid #334155;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-btn-execute {
                background: linear-gradient(135deg, #059669 0%, #047857 100%);
                color: #ffffff;
                border: none;
                border-radius: 10px;
                padding: 12px 24px;
                font-size: 14px;
                font-weight: 700;
                cursor: pointer;
                display: inline-flex;
                align-items: center;
                gap: 8px;
                box-shadow: 0 4px 15px rgba(5, 150, 105, 0.4);
                transition: all 0.2s;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-btn-execute:hover {
                transform: translateY(-1px);
                box-shadow: 0 6px 20px rgba(5, 150, 105, 0.6);
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-btn-execute:disabled {
                opacity: 0.6;
                cursor: not-allowed;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-progress-box {
                display: none;
                margin-top: 16px;
                background: rgba(15, 23, 42, 0.6);
                border-radius: 8px;
                padding: 12px;
                border: 1px solid #334155;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-progress-bar-wrap {
                width: 100%;
                height: 8px;
                background: #1e293b;
                border-radius: 4px;
                overflow: hidden;
                margin-top: 6px;
            }
            #wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa .wzw-progress-bar-fill {
                width: 0%;
                height: 100%;
                background: linear-gradient(90deg, #10b981, #34d399);
                transition: width 0.2s ease;
            }
        </style>

        <div class="wzw-tool-header">
            <h3 class="wzw-tool-title">
                <span>📑</span> Conversor de PDF para Excel (.xlsx / .csv)
            </h3>
            <span class="wzw-badge-client">100% Client-Side • Privacidade Total</span>
        </div>

        <!-- Dropzone de Entrada -->
        <div id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_dropzone" class="wzw-dropzone">
            <input type="file" id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_file_input" accept="application/pdf" style="display: none;">
            <span class="wzw-drop-icon">📗</span>
            <p class="wzw-drop-title">Arraste seu arquivo PDF aqui ou clique para selecionar</p>
            <p class="wzw-drop-sub">Extraia tabelas, faturas, extratos e demonstrativos financeiros para planilhas editáveis do Excel</p>
        </div>

        <!-- Espaço de Trabalho -->
        <div id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_workspace" class="wzw-workspace">
            <div class="wzw-file-summary">
                <div class="wzw-file-meta">
                    <span class="wzw-file-icon">📊</span>
                    <div class="wzw-file-details">
                        <strong id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_file_name">documento.pdf</strong>
                        <span id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_file_stats">0 páginas • 0 KB</span>
                    </div>
                </div>
                <button type="button" id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_btn_change" class="wzw-btn-outline">Trocar Arquivo</button>
            </div>

            <!-- Grade de Opções de Extração -->
            <div class="wzw-config-grid">
                <div>
                    <label class="wzw-form-label" for="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_format_select">Formato de Exportação:</label>
                    <select id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_format_select" class="wzw-select">
                        <option value="xlsx" selected>Microsoft Excel (.xlsx)</option>
                        <option value="csv">Valores Separados por Vírgula (.csv)</option>
                    </select>
                </div>

                <div>
                    <label class="wzw-form-label" for="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_structure_select">Estrutura das Abas:</label>
                    <select id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_structure_select" class="wzw-select">
                        <option value="single" selected>Consolidar em 1 Única Planilha Contínua</option>
                        <option value="multi">Criar 1 Aba por Página do PDF</option>
                    </select>
                </div>

                <div>
                    <label class="wzw-form-label" for="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_range_input">Páginas para Extrair:</label>
                    <input type="text" id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_range_input" class="wzw-input-text" placeholder="Todas ou Ex: 1-5, 8">
                </div>

                <div>
                    <label class="wzw-form-label" for="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_output_name">Nome do Arquivo Gerado:</label>
                    <input type="text" id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_output_name" class="wzw-input-text" value="dados-extraidos">
                </div>
            </div>

            <!-- Pré-visualização dos Dados Detectados -->
            <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;">
                <label class="wzw-form-label" style="margin-bottom: 0;">Dados e Linhas Detectadas no PDF:</label>
                <span id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_data_counter" style="font-size: 12px; color: #34d399; font-weight: 600;">0 linhas identificadas</span>
            </div>
            <div class="wzw-table-preview-card">
                <table id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_excel_grid" class="wzw-excel-grid">
                    <tbody></tbody>
                </table>
            </div>

            <!-- Barra de Progresso -->
            <div id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_progress" class="wzw-progress-box">
                <div style="display: flex; justify-content: space-between; font-size: 12px; color: #cbd5e1;">
                    <span id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_progress_status">Varrendo páginas e alinhando colunas...</span>
                    <span id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_progress_percent">0%</span>
                </div>
                <div class="wzw-progress-bar-wrap">
                    <div id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_progress_fill" class="wzw-progress-bar-fill"></div>
                </div>
            </div>

            <!-- Barra de Ações -->
            <div class="wzw-action-bar">
                <button type="button" id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_btn_reset" class="wzw-btn-outline">Recomeçar</button>
                <button type="button" id="wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_btn_execute" class="wzw-btn-execute">
                    <span>⚡</span> Extrair e Baixar Planilha Excel (.xlsx)
                </button>
            </div>
        </div>

        <script>
        (function() {
            const root = document.getElementById('wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa');
            if (!root) return;

            if (window.pdfjsLib && !window.pdfjsLib.GlobalWorkerOptions.workerSrc) {
                window.pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js';
            }

            const dropZone = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_dropzone');
            const fileInput = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_file_input');
            const workspace = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_workspace');
            const fileNameElem = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_file_name');
            const fileStatsElem = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_file_stats');
            const btnChange = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_btn_change');
            const btnReset = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_btn_reset');
            const btnExecute = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_btn_execute');
            const formatSelect = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_format_select');
            const structureSelect = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_structure_select');
            const rangeInput = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_range_input');
            const outputNameInput = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_output_name');
            const dataCounter = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_data_counter');
            const tableGrid = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_excel_grid tbody');
            const progressBox = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_progress');
            const progressStatus = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_progress_status');
            const progressPercent = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_progress_percent');
            const progressFill = root.querySelector('#wzw_pdf2xls_e8fc13c8_9dde_42a0_9931_812a988926aa_progress_fill');

            let pdfDocInstance = null;
            let totalPages = 0;
            let extractedPagesData = []; // Array de matrizes [ [ [col1, col2, ...], [row2...] ], ...]

            function formatBytes(bytes) {
                if (bytes === 0) return '0 Bytes';
                const k = 1024;
                const sizes = ['Bytes', 'KB', 'MB'];
                const i = Math.floor(Math.log(bytes) / Math.log(k));
                return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];
            }

            dropZone.addEventListener('click', () => fileInput.click());

            ['dragenter', 'dragover'].forEach(name => {
                dropZone.addEventListener(name, (e) => {
                    e.preventDefault();
                    dropZone.classList.add('drag-over');
                });
            });

            ['dragleave', 'drop'].forEach(name => {
                dropZone.addEventListener(name, (e) => {
                    e.preventDefault();
                    dropZone.classList.remove('drag-over');
                });
            });

            dropZone.addEventListener('drop', (e) => {
                if (e.dataTransfer.files && e.dataTransfer.files[0]) {
                    loadFile(e.dataTransfer.files[0]);
                }
            });

            fileInput.addEventListener('change', (e) => {
                if (e.target.files && e.target.files[0]) {
                    loadFile(e.target.files[0]);
                }
            });

            btnChange.addEventListener('click', () => fileInput.click());

            btnReset.addEventListener('click', () => {
                pdfDocInstance = null;
                totalPages = 0;
                extractedPagesData = [];
                tableGrid.innerHTML = '';
                dataCounter.textContent = '0 linhas identificadas';
                fileInput.value = '';
                workspace.style.display = 'none';
                dropZone.style.display = 'block';
                progressBox.style.display = 'none';
            });

            async function loadFile(file) {
                if (file.type !== 'application/pdf' && !file.name.toLowerCase().endsWith('.pdf')) {
                    alert('Por favor, selecione um arquivo em formato PDF.');
                    return;
                }

                if (!window.pdfjsLib) {
                    alert('O motor de leitura PDF ainda está carregando.');
                    return;
                }

                try {
                    fileNameElem.textContent = file.name;
                    outputNameInput.value = file.name.replace(/\.[^/.]+$/, "") + '-planilha';

                    const buffer = await file.arrayBuffer();
                    const task = pdfjsLib.getDocument({ data: buffer });
                    pdfDocInstance = await task.promise;
                    totalPages = pdfDocInstance.numPages;

                    fileStatsElem.textContent = `${totalPages} ${totalPages === 1 ? 'página' : 'páginas'} • ${formatBytes(file.size)}`;

                    rangeInput.placeholder = `1-${totalPages}`;
                    rangeInput.value = `1-${totalPages}`;

                    dropZone.style.display = 'none';
                    workspace.style.display = 'block';

                    await extractAndPreview();

                } catch (err) {
                    console.error('Erro ao ler PDF:', err);
                    alert('Falha ao processar o arquivo PDF: ' + err.message);
                }
            }

            async function extractAndPreview() {
                extractedPagesData = [];
                tableGrid.innerHTML = '';
                let totalRowsCount = 0;

                const pagesToScan = Math.min(totalPages, 5); // Faz preview das primeiras páginas

                for (let pNum = 1; pNum <= pagesToScan; pNum++) {
                    const page = await pdfDocInstance.getPage(pNum);
                    const textContent = await page.getTextContent();
                    const pageRows = parseTextItemsToRows(textContent.items);
                    extractedPagesData.push({ pageNum: pNum, rows: pageRows });
                    totalRowsCount += pageRows.length;
                }

                dataCounter.textContent = `${totalRowsCount} linhas detectadas nas primeiras ${pagesToScan} páginas`;

                // Renderiza preview na tabela
                let previewRowCount = 0;
                for (const pageObj of extractedPagesData) {
                    for (const row of pageObj.rows) {
                        if (previewRowCount >= 100) break; // Limite de visualização para performance
                        const tr = document.createElement('tr');
                        row.forEach(cell => {
                            const td = document.createElement('td');
                            td.textContent = cell;
                            tr.appendChild(td);
                        });
                        tableGrid.appendChild(tr);
                        previewRowCount++;
                    }
                    if (previewRowCount >= 100) break;
                }
            }

            // Agrupa itens de texto em linhas com base em Y, e colunas com base em X
            function parseTextItemsToRows(items) {
                if (!items || items.length === 0) return [];

                // Agrupa itens com Y próximo (tolerância de 5px)
                const yGroups = [];

                items.forEach(item => {
                    if (!item.str || !item.str.trim()) return;
                    const y = item.transform[5];
                    const x = item.transform[4];

                    let matchedGroup = null;
                    for (let g of yGroups) {
                        if (Math.abs(g.y - y) <= 6) {
                            matchedGroup = g;
                            break;
                        }
                    }

                    if (!matchedGroup) {
                        matchedGroup = { y: y, items: [] };
                        yGroups.push(matchedGroup);
                    }

                    matchedGroup.items.push({ x: x, text: item.str.trim() });
                });

                // Ordena grupos verticalmente de cima para baixo (no PDF, Y maior = topo)
                yGroups.sort((a, b) => b.y - a.y);

                const rows = [];
                yGroups.forEach(g => {
                    // Ordena itens da linha da esquerda para a direita
                    g.items.sort((a, b) => a.x - b.x);

                    const rowCells = [];
                    let lastX = -1;
                    let currentCell = '';

                    g.items.forEach(item => {
                        // Se a distância X for grande (> 25px), consideramos uma nova coluna
                        if (lastX !== -1 && (item.x - lastX) > 28) {
                            if (currentCell) {
                                rowCells.push(currentCell);
                                currentCell = '';
                            }
                        }

                        if (currentCell) {
                            currentCell += ' ' + item.text;
                        } else {
                            currentCell = item.text;
                        }
                        lastX = item.x + (item.text.length * 6);
                    });

                    if (currentCell) {
                        rowCells.push(currentCell);
                    }

                    if (rowCells.length > 0) {
                        rows.push(rowCells);
                    }
                });

                return rows;
            }

            function parseRange(str, max) {
                if (!str || !str.trim()) {
                    return Array.from({ length: max }, (_, i) => i + 1);
                }
                const pages = new Set();
                const parts = str.split(',');
                for (let part of parts) {
                    part = part.trim();
                    if (!part) continue;
                    if (part.includes('-')) {
                        const [s, e] = part.split('-');
                        const start = parseInt(s);
                        const end = parseInt(e);
                        if (!isNaN(start) && !isNaN(end)) {
                            const minVal = Math.max(1, Math.min(start, end));
                            const maxVal = Math.min(max, Math.max(start, end));
                            for (let i = minVal; i <= maxVal; i++) pages.add(i);
                        }
                    } else {
                        const p = parseInt(part);
                        if (!isNaN(p) && p >= 1 && p <= max) pages.add(p);
                    }
                }
                return Array.from(pages).sort((a, b) => a - b);
            }

            btnExecute.addEventListener('click', async () => {
                if (!pdfDocInstance) return;

                if (typeof window.XLSX === 'undefined') {
                    alert('A biblioteca SheetJS ainda está carregando.');
                    return;
                }

                const targetPages = parseRange(rangeInput.value, totalPages);
                if (targetPages.length === 0) {
                    alert('Nenhuma página válida selecionada.');
                    return;
                }

                btnExecute.disabled = true;
                progressBox.style.display = 'block';
                progressPercent.textContent = '10%';
                progressFill.style.width = '10%';
                progressStatus.textContent = 'Extraindo dados de todas as páginas...';

                try {
                    const format = formatSelect.value;
                    const structure = structureSelect.value;
                    const baseFileName = (outputNameInput.value.trim() || 'dados-extraidos');

                    const wb = XLSX.utils.book_new();
                    const combinedRows = [];

                    for (let idx = 0; idx < targetPages.length; idx++) {
                        const pageNum = targetPages[idx];
                        const pct = Math.round(15 + ((idx + 1) / targetPages.length) * 75);
                        progressPercent.textContent = pct + '%';
                        progressFill.style.width = pct + '%';
                        progressStatus.textContent = `Processando dados da página ${pageNum}...`;

                        const page = await pdfDocInstance.getPage(pageNum);
                        const textContent = await page.getTextContent();
                        const rows = parseTextItemsToRows(textContent.items);

                        if (structure === 'multi') {
                            const ws = XLSX.utils.aoa_to_sheet(rows.length > 0 ? rows : [['[Página sem dados tabulares]']]);
                            XLSX.utils.book_append_sheet(wb, ws, `Pág_${pageNum}`);
                        } else {
                            rows.forEach(r => combinedRows.push(r));
                        }
                    }

                    if (structure === 'single') {
                        const ws = XLSX.utils.aoa_to_sheet(combinedRows.length > 0 ? combinedRows : [['Nenhum dado tabular encontrado']]);
                        XLSX.utils.book_append_sheet(wb, ws, 'Dados');
                    }

                    progressStatus.textContent = 'Gerando arquivo de planilha...';
                    progressPercent.textContent = '95%';
                    progressFill.style.width = '95%';

                    if (format === 'csv') {
                        // Exporta primeira aba como CSV
                        const firstSheetName = wb.SheetNames[0];
                        const csvContent = XLSX.utils.sheet_to_csv(wb.Sheets[firstSheetName]);
                        const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
                        const url = URL.createObjectURL(blob);
                        const a = document.createElement('a');
                        a.href = url;
                        a.download = `${baseFileName}.csv`;
                        document.body.appendChild(a);
                        a.click();
                        document.body.removeChild(a);
                    } else {
                        // Exporta como .xlsx
                        XLSX.writeFile(wb, `${baseFileName}.xlsx`);
                    }

                    progressPercent.textContent = '100%';
                    progressFill.style.width = '100%';
                    progressStatus.textContent = 'Planilha exportada com sucesso!';

                    setTimeout(() => {
                        btnExecute.disabled = false;
                        progressBox.style.display = 'none';
                        progressPercent.textContent = '0%';
                        progressFill.style.width = '0%';
                    }, 2500);

                } catch (err) {
                    console.error('Erro ao converter para Excel:', err);
                    alert('Ocorreu um erro na conversão para Excel: ' + err.message);
                    btnExecute.disabled = false;
                    progressBox.style.display = 'none';
                }
            });
        })();
        </script>
    </div>
    
<h2>Destaques da Extração de Tabelas PDF para Excel</h2>
<p>Recuperar dados tabulares presos em arquivos PDF agora é simples, seguro e instantâneo:</p>
<ul>
<li><strong>Alinhamento Automático de Colunas:</strong> Algoritmo de tolerância que agrupa células na mesma linha mesmo em layouts complexos.</li>
<li><strong>Visualização em Tabela Dinâmica:</strong> Confira uma prévia das linhas detectadas diretamente na interface antes de exportar.</li>
<li><strong>Opção de Abas Individuais:</strong> Escolha entre consolidar todas as páginas em uma única planilha corrida ou gerar uma aba do Excel para cada página do PDF.</li>
<li><strong>Duplo Formato de Saída:</strong> Exporte em formato <strong>Microsoft Excel (.xlsx)</strong> ou <strong>Arquivo CSV (.csv)</strong> para importar em sistemas externos.</li>
</ul>
<h2>Como Converter Arquivos PDF em Planilhas Excel</h2>
<ol>
<li>Arraste o arquivo PDF contendo dados tabulares para a área de envio.</li>
<li>Aguarde a varredura das páginas e confira a quantidade de linhas detectadas no preview.</li>
<li>Defina o formato de exportação (.xlsx ou .csv) e a estrutura das abas.</li>
<li>Clique em <strong>&#8220;Extrair e Baixar Planilha Excel (.xlsx)&#8221;</strong> para obter seu arquivo de dados limpo e estruturado.</li>
</ol>
<h2>Perguntas Frequentes sobre PDF para Excel (FAQ)</h2>
<h3>O que acontece se o PDF for uma imagem digitalizada (scanner)?</h3>
<p>A ferramenta analisa PDFs baseados em camadas vetoriais de texto gerados por sistemas digitais. Para documentos escaneados, é necessário que o arquivo tenha passado previamente por uma camada de reconhecimento de caracteres (OCR).</p>
<h3>Posso usar a planilha no Excel, Google Sheets e LibreOffice Calc?</h3>
<p>Sim. O arquivo gerado é um arquivo OpenXML (.xlsx) padronizado que abre perfeitamente em todas as versões modernas do Microsoft Excel, Google Planilhas e LibreOffice Calc.</p>
<h3>Quais outras ferramentas de dados estão disponíveis?</h3>
<p>Conheça também nossa ferramenta <a href="/conversor-de-excel-para-pdf/">Conversor de Excel para PDF</a> e visite o <a href="/hub-de-pdfs/">Hub Central de Ferramentas de PDF</a> e o <a href="/ferramentas-do-desenvolvedor-web/">Hub do Desenvolvedor Web</a>.</p>
<p><script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Como o conversor detecta as colunas e linhas da tabela no PDF?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "O motor matemático analisa as coordenadas geométricas (X e Y) de cada caractere na página do PDF, alinhando automaticamente os elementos em linhas horizontais e colunas de dados."
      }
    },
    {
      "@type": "Question",
      "name": "Posso exportar em formato .csv além de .xlsx?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Sim. Você pode escolher entre Microsoft Excel (.xlsx) nativo ou texto delimitado por vírgula (.csv), facilitando a importação em bancos de dados SQL e sistemas ERP."
      }
    },
    {
      "@type": "Question",
      "name": "O conversor lê faturas, holerites e extratos bancários com segurança?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Com certeza. Como todo o cálculo é realizado localmente no seu dispositivo via JavaScript, nenhuma informação bancária ou fiscal é enviada para servidores externos."
      }
    }
  ]
}
</script></p>
<p>O post <a href="https://webzoneware.com/web-ferramentas/pdf/conversor-de-pdf-para-excel/">Conversor de PDF para Excel Online Grátis | Web-ZoneWare</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-ferramentas/pdf/conversor-de-pdf-para-excel/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
