Diagnóstico de reparo de PDF e plano de recuperação
Um PDF danificado costuma gerar uma lista confusa de mensagens do analisador sem explicar o que realmente pode ser reparado.
Executar grátis
Este diagnóstico transforma essas constatações estruturais em um relatório prático. Informe problemas como tabela de referências cruzadas ausente, stream não terminado, valor de comprimento incorreto ou arquivo truncado. Cada item recebe uma classificação consistente, nível de risco, recomendação e posição em um plano ordenado. O resultado ajuda a decidir se uma tentativa automatizada de reparo é adequada antes de alterar o arquivo original.
Transforme mensagens do validador em uma decisão de reparo
Validadores de PDF identificam bem estruturas quebradas, mas sua saída raramente constitui um apoio completo à decisão. Uma mensagem sobre uma tabela de referências cruzadas ausente descreve uma falha de navegação, enquanto um fim de arquivo inesperado pode significar que bytes foram perdidos definitivamente. Tratar essas constatações da mesma forma pode desperdiçar tempo ou destruir evidências que um especialista conseguiria recuperar. Este diagnóstico normaliza cada descrição fornecida e a compara com famílias explícitas de falhas estruturais. Ele marca problemas reconhecidos como reparáveis somente quando existe uma técnica limitada de reconstrução. Também atribui um nível de risco e explica a ação recomendada. Descrições desconhecidas são deliberadamente classificadas como não reparáveis por este relatório automatizado, pois uma suposição confiante é perigosa quando limites de objetos e referências já podem estar comprometidos. Inclua número do objeto, deslocamento em bytes, página ou localização do trailer quando o validador fornecer esse dado. O contexto é copiado para o relatório, permitindo relacionar cada recomendação à constatação original sem procurar em outro registro.
Entenda o significado de reparável
Uma classificação reparável significa que o registro estrutural danificado geralmente pode ser reconstruído com informações ainda presentes em outra parte do arquivo. Por exemplo, marcadores de objetos indiretos podem ser examinados para reconstruir um índice de referências cruzadas ausente, e os bytes codificados de um stream podem ser medidos para corrigir um valor Length divergente. Isso não significa que todas as páginas, fontes, imagens, anotações ou valores de formulário estejam intactos. Um stream não terminado é classificado como reparável com risco alto porque um limite confiável do objeto seguinte pode revelar seu fim, embora dados binários ambíguos ainda possam impedir um reparo seguro. Em contrapartida, truncamento não é reparável quando os bytes ausentes continham conteúdo único, e um catálogo ausente não pode ser corrigido automaticamente porque selecionar a raiz do documento exige compreender as relações pretendidas. Falhas de criptografia também ficam bloqueadas até que credenciais autorizadas estejam disponíveis. Preserve o arquivo original, trabalhe em uma cópia e avalie a recomendação junto ao risco. As classificações são determinísticas: descrições idênticas produzem resultados idênticos, sem rede, aleatoriedade ou interpretação por modelo de linguagem.
Aplique e verifique o plano ordenado
O plano gerado inclui apenas itens classificados como reparáveis e mantém a ordem de descoberta. Essa ordem facilita a comparação com o registro do validador, embora uma ferramenta de reparo possa precisar agrupar alterações relacionadas em uma única regravação. Preserve gerações de objetos quando possível, evite reutilizar identificadores ocupados e atualize referências indiretas sempre que um objeto for renumerado. Se a extensão dos streams ou os deslocamentos dos objetos mudarem, reconstrua as referências cruzadas depois dessas edições, e não antes. Cada etapa inclui uma instrução para analisar novamente a saída e confirmar que a constatação correspondente desapareceu sem criar novas falhas estruturais. A verificação final deve usar um analisador independente, pois testar apenas com a biblioteca que realizou o reparo pode ocultar premissas compartilhadas. Compare o número de páginas e o grafo de objetos acessíveis com a origem, abra visualmente páginas representativas e confira recursos interativos relevantes. Uma análise estrutural bem-sucedida é necessária, mas não prova que conteúdo ausente foi restaurado. Caso algum item seja classificado como não reparável, mantenha-o no registro do caso e encaminhe-o para análise em vez de omiti-lo silenciosamente.
Casos de uso
Fazer a triagem de um relatório
Converta constatações estruturais brutas em uma lista consistente de problemas reparáveis e bloqueados antes de atribuir o trabalho técnico.
Planejar um fluxo de recuperação
Use recomendações ordenadas para escolher etapas de reconstrução e verificações após cada alteração.
Documentar uma decisão de reparo
Anexe classificações, localizações, riscos e recomendações a um incidente ou registro de recuperação de arquivo.
Perguntas frequentes
Esta capacidade repara o próprio PDF?
Não. Ela classifica uma lista fornecida de constatações estruturais e produz um plano; nunca recebe nem altera os bytes do PDF.
O que significa reparável no relatório?
Significa que um reparo estrutural reconhecido geralmente pode ser derivado das informações preservadas. Não garante que todo o conteúdo seja recuperável.
O que acontece com uma mensagem desconhecida?
Ela é classificada como problema estrutural não reconhecido e não reparável automaticamente, com recomendação de inspeção manual.
Por que uma lista vazia é rejeitada?
Um diagnóstico sem constatações não pode classificar nada nem produzir um plano significativo, portanto a solicitação retorna erro de entrada inválida.
Quanto custa um relatório?
Cada solicitação de API custa US$ 0,002. A capacidade usa processamento local determinístico, sem modelo externo ou serviço de rede.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/pdf/repair-report \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"issues":[{"description":"Missing cross-reference table","location":"file trailer"},{"description":"Unterminated stream","location":"object 18"}]}'const res = await fetch("https://api.kit.forhosting.com/pdf/repair-report", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"issues": [
{
"description": "Missing cross-reference table",
"location": "file trailer"
},
{
"description": "Unterminated stream",
"location": "object 18"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/pdf/repair-report",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"issues": [
{
"description": "Missing cross-reference table",
"location": "file trailer"
},
{
"description": "Unterminated stream",
"location": "object 18"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/pdf/repair-report", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"issues":[{"description":"Missing cross-reference table","location":"file trailer"},{"description":"Unterminated stream","location":"object 18"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"issues":[{"description":"Missing cross-reference table","location":"file trailer"},{"description":"Unterminated stream","location":"object 18"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/pdf/repair-report", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"issues": [
{
"description": "Missing cross-reference table",
"location": "file trailer"
},
{
"description": "Unterminated stream",
"location": "object 18"
}
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.repair_report",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_items | 200 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |