Pular para o conteúdo
TCloud desenvolvedores
TCloud Scanner

Manual de Integração para Desenvolvedores

Qualquer sistema web PHP/JavaScript pode receber digitalizações TWAIN da estação implementando dois endpoints e abrindo um link tcloudscan://. O Kit de Integração 1.2.0 (PHP 5.6 a 8.x) entrega as duas pontas prontas, e o sistema escolhe se a digitalização chega em imagens, só JPG ou PDF; este manual traz o contrato completo para quem quiser implementar do zero.

TCloud Scanner 1.2.0 Kit de Integração 1.2.0 Saída: imagens · JPG · PDFAtualização automáticaPHP 5.6 – 8.xWindows 10 / 11 · TWAIN 32 e 64 bits atualizado em 5 de outubro de 2026 22 min de leitura
Começar a leitura Baixar .html

1Como funciona

O navegador nunca fala com o scanner nem com a estação: tudo passa pelo seu servidor, autenticado por um token de pedido. São três peças — a sua tela, o seu servidor (dois endpoints) e o TCloud Scanner instalado na estação.

Sua telanavegador
criar · estado
Seu servidorendpoint do navegador + endpoint da estação
info · inicio · pagina · fim
TCloud Scannerestação + driver TWAIN
A tela abre o link tcloudscan:// → o Windows entrega ao TCloud Scanner → a estação conversa só com o servidor.
  1. A tela pede ao endpoint do navegador (com a sessão do usuário) um pedido de digitalização. O servidor gera um token aleatório de 256 bits e devolve o link tcloudscan://digitalizar/?u=…&t=….
  2. No clique do usuário, a tela abre o link com as opções escolhidas (resolução, cor, alimentação, frente e verso).
  3. O Windows entrega o link ao TCloud Scanner, que pede ao usuário, na primeira vez, autorização para enviar ao endereço u.
  4. A estação chama o endpoint da estação (u) com o token: info, depois inicio.
  5. O TCloud Scanner digitaliza pelo driver TWAIN e envia cada página (JPEG ou PNG) com pagina, em segundo plano, enquanto o scanner continua.
  6. Ao terminar, envia fim com o estado (concluido, cancelado ou erro).
  7. Durante todo o processo, a tela consulta estado a cada segundo, mostra as páginas que chegam e, no fim, monta o PDF (ou usa as imagens) e apaga o pedido com descartar.

Por que um link de protocolo e não um serviço em http://127.0.0.1. Desde o Chrome/Edge 142 (Local Network Access), página servida por IP de rede não chama o loopback sem permissão, e a permissão só pode ser pedida por página HTTPS. O link tcloudscan:// funciona em HTTP e em HTTPS, sem CORS e sem porta aberta na estação. É o mesmo desenho do modo local do TCloud Assinador.

2Integração em 5 passos

Com o kit, a integração é um arquivo PHP copiado, dois endpoints de poucas linhas e um botão. Os exemplos abaixo são os da pasta exemplo/ do kit, testados ponta a ponta.

Compatibilidade: o kit roda em PHP 5.6 a 8.x — o exemplo completo foi executado sem nenhum aviso em PHP 5.6.40 e em PHP 8.3, e passa no PHPCompatibility desde o 5.4. Os códigos deste manual não usam ?? nem outra sintaxe do PHP 7. Em PHP 5.x no Windows, deixe extension=php_openssl.dll ativa: é a fonte segura do token quando não existe random_bytes(). Para o seu CSRF em PHP 5, use TCloudScannerServidor::bytesAleatorios() e TCloudScannerServidor::iguais().

  1. Copie o kit para o seu sistema. php/TCloudScanner.php (classe TCloudScannerServidor) e js/tcloudscan.js (cliente TCloudScan). Para montar PDF no navegador, sirva também a pdf-lib.min.js localmente (o Atlas tem em arquivamento/assets/vendor/).

  2. Crie o endpoint da estação — público, sem sessão; o token é a credencial. Não inclua nada que abra sessão: cada chamada da estação criaria uma sessão vazia.

    PHP
    <?php
    // estacao.php
    require_once __DIR__ . '/lib/TCloudScanner.php';
    
    (new TCloudScannerServidor(__DIR__ . '/../dados/digitalizacoes', [
        'sistema' => 'BookC',      // nome mostrado na janela do TCloud Scanner
        'versao'  => '3.2.0',
    ]))->atenderEstacao();
  3. Crie o endpoint do navegador — atrás da SUA autenticação e do seu CSRF. Quatro ações: criar, estado, pagina, descartar.

    PHP
    <?php
    // scanner-api.php — PHP 5.6+
    require_once __DIR__ . '/lib/TCloudScanner.php';
    exige_login();                       // a sua função
    if ($_SERVER['REQUEST_METHOD'] === 'POST') { exige_csrf(); }
    
    $usuario = usuario_logado();         // identificador do dono do pedido
    $tcs  = new TCloudScannerServidor(__DIR__ . '/../dados/digitalizacoes', array('sistema' => 'BookC'));
    $acao = isset($_REQUEST['acao']) ? $_REQUEST['acao'] : '';
    $t    = isset($_REQUEST['t']) ? $_REQUEST['t'] : '';
    
    switch ($acao) {
        case 'criar':
            $registro = isset($_POST['registro']) ? $_POST['registro'] : null;
            $p = $tcs->criarPedido($usuario, array(), array('registro' => $registro));
            session_write_close();
            json(array('ok' => true, 'token' => $p['token'],
                  'link' => 'tcloudscan://digitalizar/?u='
                          . rawurlencode(TCloudScannerServidor::urlVizinha('estacao.php'))
                          . '&t=' . $p['token']));
        case 'estado':
            session_write_close();       // consultado a cada segundo
            $e = $tcs->estado($t, $usuario);
            $e ? json(array('ok' => true) + $e) : json(array('ok' => false, 'erro' => 'Pedido não encontrado.'), 404);
        case 'pagina':
            session_write_close();
            $n = isset($_GET['n']) ? (int) $_GET['n'] : 0;
            $tcs->enviarPagina($t, $usuario, $n);   // serve a imagem e encerra
        case 'descartar':
            $motivo = isset($_POST['motivo']) ? $_POST['motivo'] : 'descartado';
            $tcs->descartar($t, $usuario, $motivo);
            json(array('ok' => true));
    }
  4. Ponha o botão na tela. O pedido é criado ao abrir a tela (preparar) porque o navegador só abre link de aplicativo dentro do clique do usuário — se o fetch de criação acontecer depois do clique, o gesto pode expirar.

    HTML
    <script src="js/tcloudscan.js"></script>
    <script>
    var scan = new TCloudScan({
      api: 'scanner-api.php',
      cabecalhos: { 'X-CSRF-Token': CSRF },
      aoChegar: function (p) { mostrarMiniatura(scan.urlPagina(p.n), p); },
      aoMudar: function (e) { mostrarStatus(e.estado, e.paginas.length, e.mensagem); },
      aoSemResposta: function () { mostrarComoInstalar(); }
    });
    scan.preparar();
    
    botaoDigitalizar.onclick = function () {
      scan.digitalizar({ dpi: 300, cor: 'cinza', alimentacao: 'auto', duplex: false, interface: false });
    };
    </script>
  5. Use o resultado e limpe. Monte o PDF no navegador e envie pelo seu upload normal, ou leia as imagens no servidor com caminhosPaginas(). Depois chame descartar — o pedido não deve ficar no disco.

    JavaScript
    scan.montarPdf(scan.paginas, window.PDFLib, 'Matrícula 12.345').then(function (bytes) {
      var arquivo = new File([bytes], 'digitalizacao.pdf', { type: 'application/pdf' });
      minhaFilaDeUpload.adicionar(arquivo);
      scan.descartar('anexado');
    });

O link carrega o endereço do endpoint da estação, o token e as opções; só u e t são obrigatórios. As opções vêm do link, e não do servidor, para que a tela possa mudá-las sem criar outro pedido.

Link
tcloudscan://digitalizar/?u=http%3A%2F%2F26.10.20.30%2Fbookc%2Festacao.php&t=86df8cfb…a24&dpi=300&cor=cinza&alim=auto&duplex=0&ui=0&fmt=pdf
ParâmetroObrigatórioValoresEfeito na estação
usimURL absoluta http:// ou https://, codificada com rawurlencode / encodeURIComponentEndereço do endpoint da estação. Outros esquemas são recusados
tsim64 caracteres hexadecimais minúsculosToken do pedido, enviado no cabeçalho X-TCloud-Token
dpinão75 a 1200 (recomendado: 150, 200, 300, 400, 600); padrão 300ICAP_XRESOLUTION / ICAP_YRESOLUTION
cornãocor · cinza · pb; padrão cinzaICAP_PIXELTYPE + ICAP_BITDEPTH (24, 8 ou 1 bit)
alimnãoauto · alimentador · mesa; padrão autoauto usa o alimentador se existir e tiver papel; senão, a mesa
duplexnão0 · 1CAP_DUPLEXENABLED
uinão0 · 11 abre a janela do driver do fabricante
fmtnãoimagem · jpg · pdf; padrão imagemFormato de saída (seção seguinte). jpg e pdf exigem TCloud Scanner 1.2.0+
  • O caminho depois de tcloudscan:// (digitalizar/) é fixo; mantenha-o para compatibilidade com versões futuras.
  • u deve ser o endereço como a estação o enxerga. Como a estação é o mesmo computador do navegador, o host da própria requisição serve (TCloudScannerServidor::urlVizinha()). Atrás de proxy reverso ou NAT, fixe o endereço em configuração.
  • Abra o link criando um <a href> oculto e chamando click() dentro do clique do usuário (TCloudScan.abrirLink). Se a sua página tem aviso de beforeunload, ignore-o enquanto TCloudScan.abrindoLink for true.
  • Recursos que o scanner não tem são ignorados e ele digitaliza com o padrão dele. Se o driver recusar operar sem a própria janela, o TCloud Scanner abre a janela do driver.

4Formato de saída: imagens, JPG ou PDF

O sistema que integra decide como a digitalização chega, pelo fmt do link e pelo formato gravado no pedido. O padrão continua imagem, igual às versões anteriores.

fmt / formatoO que a estação entregaOnde o sistema pegaEstação mínima
imagem (padrão)JPEG (cor e cinza) e PNG de 1 bit (P&B), uma imagem por páginapaginas[], caminhosPaginas(), ação pagina1.0.0
jpgTodas as páginas em JPEG, inclusive P&Bpaginas[], caminhosPaginas(), ação pagina1.2.0
pdfUm PDF único gerado na estação, no tamanho físico real; as páginas sobem só como prévia leve (previa: true)documento, caminhoDocumento(), ação documento1.2.0
PHP
// O formato gravado no pedido é o EXIGIDO: estação anterior à 1.2.0 é recusada no inicio.
$p = $tcs->criarPedido($usuario, array('formato' => 'pdf'));
JavaScript
var scan = new TCloudScan({
  api: 'scanner-api.php',
  formato: 'pdf',                               // vai no criar e no link
  aoDocumento: function (doc) {                 // {bytes, paginas, sha256, recebido}
    visualizador.src = scan.urlDocumento();
  }
});

Como o modo PDF funciona. A estação guarda cada página em qualidade total no próprio disco e envia ao sistema só uma prévia reduzida (até ~1400 px), para a tela acompanhar. Ao terminar, gera o PDF — JPEG embutido sem recompressão, P&B em 1 bit — e o envia em partes com a ação documento. O servidor confere o SHA-256 antes de aceitar. "Digitalizar mais páginas" gera o PDF de novo com todas as páginas do pedido e substitui o anterior. O estado só vira concluido depois de o PDF chegar.

  • Use pdf quando o sistema só precisa guardar o documento: o PDF sai pronto da estação, sem pdf-lib no navegador nem TCPDF no servidor.
  • Use imagem ou jpg quando o usuário for girar, excluir ou reordenar páginas na tela antes de anexar: no modo pdf, essas ações nas prévias não mudam o PDF da estação.
  • As páginas em qualidade total ficam na estação em %LOCALAPPDATA%\TCloud\Scanner\pedidos\<token> e são apagadas quando o pedido vence.

5Endpoint da estação

Um único URL (o u do link) atende cinco ações pelo parâmetro acao. A estação chama sempre nesta ordem: info → inicio → pagina (N vezes) → (só no formato pdf: documento, em partes) → fim. Clicar em "Digitalizar mais páginas" repete inicio → pagina → fim com o mesmo token, e as páginas continuam a numeração.

Regras comuns a todas as chamadas

  • Autenticação: cabeçalho X-TCloud-Token: <token> (aceite também ?t= como reserva). Sem sessão, sem cookie.
  • User-Agent: TCloudScanner/<versão>. Não use para autorizar — serve só para log.
  • Resposta sempre JSON UTF-8: {"ok": true, …} ou {"ok": false, "erro": "mensagem para o usuário"}. A estação mostra erro na tela, então escreva em português claro.
  • Erro com corpo JSON (4xx) não é repetido pela estação. Falha de rede sem resposta é repetida até 4 vezes, com espera crescente.
AçãoMétodoCorpo enviadoResposta de sucessoO servidor deve
infoGET—ok, sistema, versao, estado, opcoes, paginas, limite, expira, formato, parte_maxValidar o token e gravar contato = agora. parte_max = maior pedaço de PDF por requisição (abaixo do post_max_size)
inicioPOSTJSON {estacao, versao, scanner, formato} (formato desde a 1.2.0)ok, paginasPôr estado = digitalizando, guardar os dados da estação. Se o pedido exige jpg/pdf e o corpo não traz formato, responder 426 pedindo a atualização
paginaPOSTBinário da imagem; Content-Type: image/jpeg ou image/png; cabeçalhos X-Dpi e, no modo pdf, X-Previa: 1ok, n (número da página)Conferir o conteúdo (getimagesizefromstring), gravar, numerar em sequência, marcar previa
documentoPOSTPedaço do PDF; cabeçalhos X-Offset, X-Total, X-Paginas, X-Sha256 e X-Final: 1 no últimook, recebido (e documento no último)Exigir que o pedaço comece onde o parcial termina (senão 409 com esperado); no primeiro, exigir %PDF-; no último, conferir tamanho e SHA-256 e substituir o PDF anterior
fimPOSTJSON {estado, mensagem}ok, paginasGravar estado (concluido · cancelado · erro) e mensagem

Exemplos

HTTP
GET /bookc/estacao.php?acao=info
X-TCloud-Token: 86df8cfb491d71c7c6af88362d30f220e68ea113dfe4a8b3467c2ca00bc85a24

200 {"ok":true,"sistema":"BookC","versao":"3.2.0","estado":"aguardando",
     "opcoes":{"dpi":300,"cor":"cinza","duplex":false,"alimentacao":"auto","interface":false},
     "paginas":0,"limite":400,"expira":1791233406}
HTTP
POST /bookc/estacao.php?acao=inicio
X-TCloud-Token: 86df8c…
Content-Type: application/json

{"estacao":"RECEPCAO-02","versao":"1.2.0","scanner":"fi-7160","formato":"pdf"}

200 {"ok":true,"paginas":0}
HTTP
POST /bookc/estacao.php?acao=pagina
X-TCloud-Token: 86df8c…
Content-Type: image/jpeg
X-Dpi: 300
Content-Length: 1482211

<bytes do JPEG>

200 {"ok":true,"n":3}
422 {"ok":false,"erro":"A página precisa ser JPEG ou PNG."}
HTTP
POST /bookc/estacao.php?acao=documento          (formato pdf: um POST por pedaço)
X-TCloud-Token: 86df8c…
Content-Type: application/pdf
X-Offset: 8323072
X-Total: 9841520
X-Paginas: 12
X-Sha256: 5b25cd66a903680b4039893d3e8fcd548fa53ed922f68b4d9923e0716d9698e8
X-Final: 1

<bytes 8323072 a 9841519 do PDF>

200 {"ok":true,"recebido":9841520,"documento":{"bytes":9841520,"paginas":12,"sha256":"5b25cd…","recebido":1791227250}}
409 {"ok":false,"erro":"Parte fora de ordem.","esperado":8323072}
422 {"ok":false,"erro":"O PDF chegou corrompido (SHA-256 não confere). Digitalize de novo."}
HTTP
POST /bookc/estacao.php?acao=fim
X-TCloud-Token: 86df8c…
Content-Type: application/json

{"estado":"erro","mensagem":"papel enroscado no alimentador."}

200 {"ok":true,"paginas":5}

Códigos HTTP usados pelo kit

CódigoQuando
401Token ausente ou com formato inválido
404Token válido, mas pedido inexistente (já descartado ou limpo)
405inicio, pagina, documento ou fim sem POST
409Pedaço do PDF fora de ordem; a resposta traz esperado
410Pedido vencido ou descartado
413Página acima de max_bytes_pagina ou PDF acima de max_bytes_documento
422Página ou PDF recusado (não é JPEG/PNG/PDF, vazio, SHA-256 não confere, limite de páginas)
426O pedido exige jpg/pdf e a estação é anterior à 1.2.0

Detalhes das páginas. No formato imagem, colorido e cinza chegam em JPEG qualidade 85 e preto e branco em PNG de 1 bit; no formato jpg, tudo em JPEG; no formato pdf, as páginas são prévias reduzidas (JPEG qualidade 70, até ~1400 px; P&B pode vir no PNG original, que já é menor). X-Dpi traz a resolução real informada pelo driver (que pode diferir da pedida); guarde-a com a página, pois é ela que dá o tamanho físico no PDF. O kit também aceita X-Giro (0, 90, 180, 270), reservado para versões futuras da estação.

O endpoint do navegador é seu: o protocolo não o fixa. O formato abaixo é o que o cliente TCloudScan espera; se mudar, adapte o cliente.

AçãoMétodoParâmetrosResposta
criarPOST + CSRFformato (imagem · jpg · pdf) e seus dados de contexto{ok, token, link} — link sem as opções; o cliente acrescenta
estadoGETt{ok, token, estado, mensagem, contato, agora, estacao, opcoes, contexto, paginas[], expira, formato, formato_estacao, documento}
paginaGETt, nA imagem (image/jpeg ou image/png)
documentoGETt (e baixar=1 para download)O PDF gerado na estação (formato pdf)
descartarPOST + CSRFt, motivo{ok}

Cada item de paginas[]: {n, tipo, dpi, giro, largura, altura, bytes} — tipo é jpg ou png; largura e altura em pixels. estacao: {nome, versao, scanner}. contato: horário Unix da última chamada da estação (0 = nunca), compare com agora.

Desde a 1.2.0: cada página traz também previa (true no formato pdf); documento é {bytes, paginas, sha256, recebido} ou null; formato_estacao é o que a estação disse que entrega (vazio antes do inicio).

new TCloudScannerServidor(string $pastaDados, array $cfg) — $cfg: sistema (nome na janela da estação), versao, validade_min (180), max_paginas (400), max_bytes_pagina (40 MB), max_bytes_documento (1 GB), auditoria (callable($evento, $pedido, $extra)).

MétodoRetornoUso
criarPedido($usuario, $opcoes = [], $contexto = [])resumo com tokenCria o pedido do usuário logado. $opcoes['formato'] (imagem · jpg · pdf) é o formato exigido. $contexto guarda o que for seu
link($token, $endpointEstacao, $opcoes)stringMonta o link completo no servidor (inclui fmt), se preferir não montar no JS
estado($token, $usuario)resumo ou nullnull se não existe ou é de outro usuário
enviarPagina($token, $usuario, $n)encerra o scriptServe a imagem com nosniff e CSP sandbox
caminhoPagina($token, $usuario, $n)caminho ou nullPara processar a página no servidor
caminhosPaginas($token, $usuario)array de caminhosTodas, na ordem de chegada (ex.: montar PDF com TCPDF/FPDF)
caminhoDocumento($token, $usuario)caminho ou nullO PDF da estação (formato pdf), para mover para o seu acervo
enviarDocumento($token, $usuario, $nome, $baixar)encerra o scriptServe o PDF da estação (inline ou download)
descartar($token, $usuario, $motivo)boolApaga pedido, páginas e PDF
atenderEstacao()encerra o scriptEndpoint da estação inteiro
limparVencidos()—Chamado em cada criarPedido; pode ir num agendador
TCloudScannerServidor::urlVizinha($arquivo)stringURL de um script vizinho, como o navegador acessou
TCloudScannerServidor::bytesAleatorios($n)string bináriaBytes seguros em qualquer versão do PHP (use no seu CSRF em PHP 5)
TCloudScannerServidor::iguais($a, $b)boolComparação em tempo constante em qualquer versão do PHP

Eventos de auditoria (além de documento, quando o PDF chega): pedido, inicio, concluido, cancelado, erro, e o motivo passado a descartar (anexado, descartado…).

new TCloudScan({api, cabecalhos, intervalo, esperaEstacaoMs, aoMudar, aoChegar, aoSemResposta, aoErro}) — intervalo padrão 1000 ms (3000 com a aba em segundo plano); esperaEstacaoMs padrão 12000.

MembroUso
formato (opção do construtor)imagem (padrão) · jpg · pdf. Vai no criar e no link; digitalizar({formato}) pode trocar só o link
aoDocumento(doc) (opção do construtor)Chamado quando o PDF da estação chega ou é substituído ("Digitalizar mais páginas")
preparar()Cria o pedido e começa a acompanhar. Chame ao abrir a tela
digitalizar(opcoes)Abre o TCloud Scanner. Só dentro de um clique. Devolve false se o pedido ainda não estiver pronto
paginasPáginas recebidas, na ordem de chegada (no modo pdf, prévias)
documento{bytes, paginas, sha256, recebido} do PDF da estação, ou null
urlPagina(n) / baixarPagina(n)URL para <img> / ArrayBuffer da página
urlDocumento() / baixarDocumento()URL / ArrayBuffer do PDF da estação
montarPdf(paginas, PDFLib, titulo)Promise<Uint8Array>; respeita giro + giroUsuario de cada item (formatos imagem e jpg)
pausar()Para de consultar sem apagar (tela fechada, pode voltar)
descartar(motivo)Apaga no servidor e zera o cliente
TCloudScan.abrirLink(link) / TCloudScan.abrindoLinkAbre um link de aplicativo / sinaliza para o seu beforeunload

Para uma tela completa (miniaturas, girar, excluir, arrastar para reordenar, PDF ou imagens), use como referência arquivamento/assets/js/digitalizador.js do Atlas 2.1.0.

7Estados do pedido

O pedido nasce aguardando, vai para digitalizando no inicio e termina num dos três estados finais enviados pelo fim. Um novo inicio com o mesmo token ("Digitalizar mais páginas") volta para digitalizando sem perder as páginas.

EstadoQuem põeO que a tela deve mostrar
aguardandocriarPedidoPronto. Se o link foi aberto e contato não mudou em ~12 s: "TCloud Scanner não respondeu" + comando de instalação. Se contato mudou: "TCloud Scanner aberto, confirme o scanner"
digitalizandoinicio (ou a primeira página)Progresso: páginas recebidas, estacao.scanner
concluidofimRevisar e anexar. Com 0 páginas: "confira o papel no alimentador ou na mesa"
canceladofimCancelado na estação; páginas já recebidas continuam válidas
errofimMostrar mensagem (ex.: papel enroscado, scanner em uso, sem comunicação)
descartadodescartarPedido apagado; a estação recebe 404/410 se ainda tentar enviar

Como saber se a estação respondeu. Guarde contato no momento em que abrir o link; qualquer valor maior depois disso significa que o TCloud Scanner chamou info. Na primeira vez, info só acontece depois de o usuário autorizar o servidor na janela da estação — não trate essa demora como erro definitivo, só mostre a ajuda e continue consultando.

No formato pdf, a estação só envia fim depois de o PDF chegar inteiro: quando estado for concluido, documento já está preenchido. Se o envio do PDF falhar, o estado vem erro com a mensagem da estação.

8Montar o PDF no tamanho físico

Cada página do PDF deve medir o tamanho real da folha: largura e altura em pontos vêm dos pixels divididos pelo DPI real (X-Dpi), vezes 72. Uma folha A4 a 300 dpi tem 2480 × 3508 px e vira 595 × 842 pt.

pontos = pixels × 72 ÷ dpi
  • No navegador (recomendado): TCloudScan.montarPdf() com a pdf-lib, que embute JPEG e PNG sem recompressão e não consome CPU do servidor. Gire com page.setRotation() em vez de reprocessar a imagem.
  • No servidor: caminhosPaginas() devolve os arquivos na ordem; com TCPDF, AddPage no formato [w, h] em pontos e Image() ocupando a página inteira.
  • Imagens separadas: se o usuário girou a página, gire os pixels de verdade (canvas no navegador, GD no servidor) — imagem solta não tem "rotação de página".

Tamanho aproximado por página A4: P&B ~50–150 KB, cinza 300 dpi ~300–800 KB, colorido 300 dpi ~1–3 MB, colorido 600 dpi acima de 10 MB. Confira o limite de upload do seu sistema e o post_max_size do PHP antes de liberar 600 dpi colorido.

9Segurança

O endpoint da estação é público por natureza; tudo depende do token e de tratar as páginas como entrada não confiável. Confira cada item antes de publicar uma integração — o kit já cumpre os marcados com kit.

Do lado da estação, o TCloud Scanner só envia para um endereço (esquema://host:porta) que o usuário autorizou na primeira vez; a lista fica em %APPDATA%\TCloud\Scanner\config.ini. Assim, um link tcloudscan:// forjado por outro site não manda documentos para fora sem confirmação. Certificado HTTPS inválido só é aceito quando o host é IP ou nome local (.local, .lan, sem ponto); domínio público exige certificado válido.

10Estação, limites e solução de problemas

A estação precisa de Windows 10 ou 11 (o .NET Framework 4.x já vem no sistema), do driver TWAIN do fabricante e do TCloud Scanner, instalado por usuário, sem administrador:

PowerShell
powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://tcloudsoft.app/download/scanner/instalar.ps1 | iex"

Na primeira vez, o navegador pergunta se pode abrir o TCloud Scanner (marque Sempre permitir) e o TCloud Scanner pede para autorizar o endereço do sistema. Depois de escolhido, o scanner fica lembrado e a digitalização começa sozinha. Mostre o comando de instalação na sua tela quando aoSemResposta disparar.

Atualização automática (desde a 1.2.0). O TCloud Scanner se atualiza sozinho: ao abrir — no máximo a cada 6 horas, em segundo plano, sem atrasar a digitalização — ele lê versao.txt do portal. Havendo versão maior, baixa os dois executáveis, confere cada um contra o SHA256SUMS publicado e contra a versão gravada no próprio arquivo, e só então troca. A versão nova vale a partir da próxima abertura. Publicada a 1.2.0 no portal, as estações 1.2.0+ acompanham as próximas versões sem ninguém rodar o comando de novo.

  • Manual: link Procurar atualização na janela, ou TCloudScanner.exe --atualizar (sem janela; sai 0 se atualizou ou já está em dia).
  • Desligar numa estação: atualizacao_automatica=0 em %APPDATA%\TCloud\Scanner\config.ini; outro endereço: atualizacao_url=.
  • Estações 1.0/1.1 não têm atualização: rode o comando de instalação uma vez. O kit avisa isso sozinho (426) quando o sistema pede jpg ou pdf.
SintomaCausa provávelO que fazer
Nada abre ao clicar em DigitalizarTCloud Scanner não instalado, ou link aberto fora de um cliqueInstalar; abrir o link só dentro do clique (preparar() antes)
"Sem comunicação com o servidor" na estaçãou com endereço que a estação não alcança (proxy, NAT, localhost do servidor)Fixar o endpoint da estação em configuração, com o IP/nome que a estação usa
"Resposta inesperada do servidor"O endpoint devolveu HTML (erro PHP, página de login)Endpoint da estação sem exigência de login; ver o log de erros do PHP
"Página vazia" / "Parte vazia"Corpo maior que post_max_sizeAumentar post_max_size ou baixar o DPI/cor. O PDF já vai em partes abaixo desse limite (parte_max)
"Atualize o TCloud Scanner para a versão 1.2.0"O sistema pede jpg ou pdf e a estação é 1.0/1.1Rodar o comando de instalação na estação (a partir daí ela se atualiza sozinha)
"O PDF chegou corrompido"Rede instável no envio; SHA-256 não confereDigitalizar de novo; se repetir, conferir proxy/antivírus entre estação e servidor
"Nenhum scanner TWAIN encontrado"Driver só WIA, ou TWAIN não instaladoInstalar o driver TWAIN do fabricante; a lista mostra drivers 32 e 64 bits
"O scanner está em uso por outro programa"Software do fabricante abertoFechar o outro programa
"O TCloud Scanner já está aberto"Segunda digitalização com a janela anterior abertaUsar "Digitalizar mais páginas" na janela aberta, ou fechá-la
Pedido expiradoMais de validade_min minutosA tela deve criar outro pedido (preparar())

Limites. Uma digitalização por vez por usuário do Windows. Padrões do kit: 400 páginas por pedido, 40 MB por página, 180 min de validade — todos configuráveis. A estação espera até 15 min para esvaziar a fila de envio antes de reportar falha. Scanners sem driver TWAIN (só WIA ou ScanSnap Home, como o SV600) não são atendidos.

11Versões e arquivos

ComponenteVersãoOnde a versão ficaArquivos
TCloud Scanner (estação)1.2.0versao.txt → executável, janela, User-Agent, "Aplicativos instalados", atualização automáticaTCloudScanner-1.2.0.zip
Kit de Integração1.2.0 (PHP 5.6+)TCloudScannerServidor::VERSAO_KITTCloudScanner-Kit-1.2.0.zip
Atlas · Arquivamento Digital (referência de tela completa)2.1.0ARQ_VERSAO em config.phpAtlas-Arquivamento-2.1.0.zip

A 1.2.0 acrescenta o formato de saída (fmt: imagem, jpg, pdf), a ação documento e a atualização automática. Tudo o que existia continua igual: sem fmt, a estação 1.2.0 entrega exatamente o que a 1.1.0 entregava, e o Atlas 2.1.0 funciona sem alteração.

A 1.1.0 do TCloud Scanner tirou os textos fixos do Atlas: a janela mostra o nome que o sistema devolve em info.sistema. O protocolo (link, ações, cabeçalhos, formatos) é o mesmo da 1.0.0 — sistemas integrados com uma funcionam com a outra.

Compatibilidade futura. Ignore campos desconhecidos nos JSON da estação e aceite cabeçalhos extras: versões novas do TCloud Scanner podem acrescentar dados sem quebrar integrações existentes.

Downloads