Processador avançado de PDF para Java

quero extrair um conteúdo diferente de um ficheiro PDF em Java:

  • o texto visível completo
  • imagens
  • ligações
Também é possível obter o seguinte?

  • documentar meta-marcas como título, descrição ou autor
  • apenas manchetes
  • elementos de entrada se o documento contiver um formulário

não preciso de manipular ou renderizar ficheiros PDF. Que Biblioteca seria a melhor para esse tipo de propósito?

actualizar

Ok, eu tentei PDFBox:

Document luceneDocument = LucenePDFDocument.getDocument(new File(path));
Field contents = luceneDocument.getField("contents");
System.out.println(contents.stringValue());

mas a saída é nula. No entanto, o campo "resumo" está OK.

O próximo trecho funciona bem.

PDDocument doc = PDDocument.load(path);
PDFTextStripper stripper = new PDFTextStripper();
String text = stripper.getText(doc);
System.out.println(text);
doc.close();

mas então, eu não tenho nenhuma pista de como extrair as imagens, links, etc.

actualizar 2

encontrei um exemplo de como extrair as imagens, mas ainda não tenho resposta sobre como extrair:

  • ligações
  • documentar meta-marcas como o título, a descrição ou autor
  • apenas manchetes
  • elementos de entrada se o documento contiver um formulário
Author: Peter Mortensen, 2011-03-27

5 answers

IText é a minha ferramenta PDF de escolha hoje em dia.

  • o texto visível completo
"Visível" é difícil. Você pode analisar todo o texto processável com o com.itextpdf.texto.documento.analisem as aulas do pacote... mas essas aulas não sabem de recortes. Você pode restringir o analisador ao tamanho da Página facilmente o suficiente.
// all text on the page, regardless of position
PdfTextExtractor.getTextFromPage(reader, pageNum);
Na verdade, é preciso o comando que leva uma estratégia Textextraction, a estratégia filtrada. Ele torna-se interessante rapidamente, mas acho que se consegue tudo o que se quer aqui "fora da caixa".
  • imagens
Sim, através das mesmas classes de pacotes. Os ouvintes de imagens não são tão bem suportados como os ouvintes de texto, mas existem.
  • ligações
Sim. Links são "anotações" para várias páginas PDF. Encontrá-los é uma simples questão de looping através de cada página "annotations array" e escolher o link anotacao.
PdfDictionary pageDict = myReader.getPageN(1);
PdfArray annots = pageDict.getAsArray(PdfName.ANNOTS);
ArrayList<String> dests = new ArrayList<String>();
if (annots != null) {
  for (int i = 0; i < annots.size(); ++i) {
    PdfDictionary annotDict = annots.getAsDict(i);
    PdfName subType = annotDict.getAsName(PdfName.SUBTYPE);
    if (subType != null && PdfName.LINK.equals(subType)) {
      PdfDictionary action = annotDict.getAsDict(PdfName.A);
      if (action != null && PdfName.URI.equals(action.getAsName(PdfName.S)) {
        dests.add(action.getAsString(PdfName.URI).toString());
      } // else { its an internal link, meh }
    }
  }
}

Você pode encontrar o PDF Spec aqui .

  • elementos de entrada
Definitivamente. Para XFA (Designer LiveCycle) ou para as formas de "AcroForm" de tecnologia mais antiga, iText pode encontrar todos os campos e seus valores.
AcroFields fields = myReader.getAcroFields();

Set<String> fieldNames = fields.getFields().keySet();
for (String fldName : fieldNames) {
  System.out.println( fldName + ": " + fields.getField( fldName ) );
}

Listas Mutli-select não seriam tratadas muito bem. Você terá um espaço em branco após o cólon para campos de texto vazios e para botões. Nada muito informativo... mas isso vai-te apanhar. iniciado.

  • documentar meta-marcas como título, descrição ou autor
Muito trivial. Sim.
Map<String, String> info = myPdfReader.getInfo();
System.out.println( info );

Para além do autor/título básico/etc, existe um esquema XML bastante envolvido que pode aceder através de reader.getMetadata().

  • apenas manchetes

Um TextRenderFilter pode ignorar o texto com base nos critérios que desejar. O tamanho da letra soa à direita com base no seu comentário.

 16
Author: Mark Storer, 2014-11-27 09:54:53
 5
Author: Dhaivat Pandya, 2011-03-27 14:50:41

Também podes usar o JPedal para todas estas tarefas de extracção.

 1
Author: mark stephens, 2011-03-27 16:22:38

Sim Alp, iText {[4] } oferece a funcionalidade que mencionou.

A LER PDFS

IText não é um visualizador de PDF, iText não pode converter PDF para uma imagem, nem iText ser usado para imprimir um PDF, mas o A classe PdfReader pode dar-lhe acesso a os objetos que formam um documento PDF e ao fluxo de conteúdo de cada pagina. Este fluxo de conteúdo pode ser processada e se o conteúdo não foi adicionado como texto rasterizado, você pode converter um página a texto. Note que o seguinte não faz OCR.

Utilizar com.itextpdf.text.pdf.PdfReader; a classe.

 0
Author: Suresh G, 2011-03-27 14:59:54

A maior parte disto você pode fazer com a nossa biblioteca PDF extended edition também.

Seja qual for a solução, tenha em mente que para certos documentos PDF, a extracção de texto é impossível devido à forma como o PDF é construído (os glifos na página, por vezes, não têm qualquer significado semântico associado a eles).

A forma rápida de verificar isto é abrir o documento em Acrobat e tentar copiar/colar o texto. Se aparecer como uma algaraviada, é provável que sim. vai aparecer como uma algaraviada em qualquer outro extractor PDF.

 0
Author: Mike B, 2011-12-26 12:55:43