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
- 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
5 answers
IText é a minha ferramenta PDF de escolha hoje em dia.
"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.
- o texto visível completo
// 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".
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.
- imagens
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.
- ligações
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 .
Definitivamente. Para XFA (Designer LiveCycle) ou para as formas de "AcroForm" de tecnologia mais antiga, iText pode encontrar todos os campos e seus valores.
- elementos de entrada
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.
Muito trivial. Sim.
- documentar meta-marcas como título, descrição ou autor
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.
Também podes usar o JPedal para todas estas tarefas de extracção.
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.
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.