Manipular arquivos de PDF grandes

10 respostas
D

Pessoal estou com um problema de java heap space.

Quando tento quebrar um arquivo pdf grande, por exemplo 800mb, para separar em pagina a pagina (arquivos menores).
Sempre tenho o estouro de memoria.

Testei com as APIs PDFBOX e ITextPDF.
Ambas acontece isso.

Tem um jeito pratico de fazer essa quebra sem ter o consumo de memoria enorme.

Tenho PDFs com 1,4gb+ e como faria para quebrar eles.

Alguma solução para isso?

Aguardo, obrigado desde já.

10 Respostas

A

Carinha, o PDF é um formato com especificação , você pode procurar na especificação e ver como a quebra de página é feita, para daí você quebrar o arquivo.

O endereço da especificação é http://partners.adobe.com/public/developer/en/pdf/PDFReference.pdf

P.S.: estou olhando a especificação agora, e vi que especificação no dos outros é refresco. Mal aê… :smiley:

E

Instale o Ghostscript e chame o comando gs (no Linux ou MacOSX) ou gswin32 ou gswin64 (no Windows). Ele é muito rápido, não tem problemas de memória, cria os nomes dos arquivos automaticamente, e existe para os principais sistemas operacionais, sem contar que é de graça.

Aqui ele ensina a fazer no Linux e no Mac, mas você pode usar um comando muito semelhante no Windows (só o nome do executável é que é um pouco diferente).

http://viktorpetersson.com/2010/10/22/how-to-split-a-pdf-files-on-mac-and-linuxunix/

A

Seria interessante saber algumas coisas a mais sobre o que você quer:

  1. Que tipo de documento é esse PDF? É um documento vindo de um scanner? É uma “impressão para PDF”? Ou é realmente algo imprevisível?

  2. Outra coisa: qual o critério que você pretende utilizar para dividir o PDF em pedaços menores?

Estive olhando a especificação do arquivo PDF e, dependendo do que você realmente necessita, talvez a minha idéia original de utilizar a especificação não seja “tãaaao” absurda assim… (ainda assim, é meio pesado, sim…)

E

Uma vez eu peguei esse GhostScript e usei para gerar vários PNGs (um por página) a partir de um PDF. Foi super-rápido e não gastou nenhuma memória.

D

Estou fazendo uma aplicação web para estudos.

Em que o usuário irá enviar um pdf (de qualquer tamanho e qualquer padrão).
O a minha página irá quebrar esse pdf em páginas menores para visualizar depois no navegador.

Essa seria a minha primeira parte, depois vou evoluir ele, como pegar o texto e indexar o mesmo com lucene. (mas isso é futuro)

O que quero é pegar o pdf (geralmente scanneado) e quebrar em partes menores para que possa ficar leve na sua visualização.

Para isso quero quebrar ele por páginas. Ler a especificação não seria uma coisa habil, mas válida.

Estou atraz de uma api que eu possa usar, passando ele como um File ou o caminho dele temporário.

E

Existem 2 tipos de PDFs escaneados.

Alguns deles são texto puro e obviamente irão necessitar de OCR para poderem ser indexados.

Outros (normalmente quando o scanner que gerou o PDF é um programa como o Adobe Acrobat ou o ABBYY FineReader) contém as páginas como imagens e ao mesmo tempo como texto. Nesse caso é possível a indexação.

E

Eu recomendaria usar o GhostScript. Basta instalá-lo e chamar (via Runtime.exec) o comando com meia dúzia de parâmetros (os quais foram mostrados nesse blog cujo link postei).
O GhostScript é muito rápido e você vai ver que muitos outros programas (por exemplo, aqueles que você acha na Internet e dizem que fazem “split de arquivos PDF”) chamam o GhostScript indiretamente (tradução: não reinvente a roda).

E

Se for um PDF escaneado (só imagens) você pode gerar é imagens, não pequenos PDFs, certo?

D

entanglement:

Se for um PDF escaneado (só imagens) você pode gerar é imagens, não pequenos PDFs, certo?

Sim,mas não vi uma diferença grande de bytes para mandar para imagem e deixar em pdf.

Sem falar se deixar no pdf, tenho a facilidade do proprio componente do adobe dar zoom, imprimir, salvar, … (posso esta falando besteira, mas tenho somente esse conhecimento).

Vou realizar uns testes com esse aplicativo que vc mencionou e dependendo do resultado utilizo ele. quero ver como é o retorno dele para o java, se consigo pegar os arquivos diretamente ou tenho que varrer a pasta especifica, pois pretendo salvar em banco e não deixar em arquivo fisico.

E

Você vai ter de pegar os arquivos que ele gerou (por exemplo, se você especificou o nome ARQUIVO%05d.pdf, ele vai gerar ARQUIVO00001.pdf, ARQUIVO00002.pdf etc.)
O bom é que é fácil conferir se ele fez tudo direitinho.

Criado 14 de agosto de 2012
Ultima resposta 14 de ago. de 2012
Respostas 10
Participantes 3