Conversões de PDF em Java

Conversões de PDF em Java

1. Introdução

Neste artigo rápido, vamos nos concentrar em fazerconversion between PDF files and other formats in Java programático.

Mais especificamente, descreveremos como salvar PDFs como arquivos de imagem, como PNG ou JPEG, converter PDFs em documentos do Microsoft Word, exportar como HTML e extrair os textos, usando várias bibliotecas de código aberto Java.

2. Dependências do Maven

A primeira biblioteca que veremos éPdf2Dom. Vamos começar com as dependências do Maven que precisamos adicionar ao nosso projeto:


    org.apache.pdfbox
    pdfbox-tools
    2.0.3


    net.sf.cssbox
    pdf2dom
    1.6

Usaremos a primeira dependência para carregar o arquivo PDF selecionado. A segunda dependência é responsável pela própria conversão. As versões mais recentes podem ser encontradas aqui:pdfbox-toolsepdf2dom.

Além do mais, usaremosiText para extrair o texto de um arquivo PDF ePOI para criar o documento.docx.

Vamos dar uma olhada nas dependências do Maven que precisamos incluir em nosso projeto:


    com.itextpdf
    itextpdf
    5.5.10


    com.itextpdf.tool
    xmlworker
    5.5.10


    org.apache.poi
    poi-ooxml
    3.15


    org.apache.poi
    poi-scratchpad
    3.15

A versão mais recente do iText pode ser encontradaheree você pode procurar o Apache POIhere.

3. Conversões de PDF e HTML

Para trabalhar com arquivos HTML, usaremosPdf2Dom - um analisador de PDF que converte os documentos em uma representação HTMLDOM. A árvore DOM obtida pode então ser serializada em um arquivo HTML ou processada posteriormente.

Para converter PDF em HTML, precisamos usar XMLWorker, biblioteca fornecida poriText.

3.1. PDF para HTML

Vamos dar uma olhada em uma conversão simples de PDF em HTML:

private void generateHTMLFromPDF(String filename) {
    PDDocument pdf = PDDocument.load(new File(filename));
    Writer output = new PrintWriter("src/output/pdf.html", "utf-8");
    new PDFDomTree().writeText(pdf, output);

    output.close();
}

No snippet de código acima, carregamos o arquivo PDF, usando a API de carregamento do PDFBox. Com o PDF carregado, usamos o analisador para analisar o arquivo e gravar na saída especificada porjava.io.Writer.

Observe queconverting PDF to HTML is never a 100%, pixel-to-pixel result. Os resultados dependem da complexidade e da estrutura do arquivo PDF específico.

3.2. HTML para PDF

Agora, vamos dar uma olhada na conversão de HTML para PDF:

private static void generatePDFFromHTML(String filename) {
    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document,
      new FileOutputStream("src/output/html.pdf"));
    document.open();
    XMLWorkerHelper.getInstance().parseXHtml(writer, document,
      new FileInputStream(filename));
    document.close();
}

Observe queconverting HTML to PDF, you need to ensure that HTML has all tags properly started and closed, otherwise the PDF will be not created. O aspecto positivo dessa abordagem é que o PDF será criado exatamente da mesma forma que no arquivo HTML.

4. PDF to Image Conversions

Existem várias maneiras de converter arquivos PDF em uma imagem. Uma das soluções mais populares é chamadaApache PDFBox. Esta biblioteca é uma ferramenta Java de código aberto para trabalhar com documentos PDF. Para a conversão de imagem em PDF, usaremosiText novamente.

4.1. PDF para imagem

Para começar a converter PDFs em imagens, precisamos usar a dependência mencionada na seção anterior -pdfbox-tools.

Vamos dar uma olhada no exemplo de código:

private void generateImageFromPDF(String filename, String extension) {
    PDDocument document = PDDocument.load(new File(filename));
    PDFRenderer pdfRenderer = new PDFRenderer(document);
    for (int page = 0; page < document.getNumberOfPages(); ++page) {
        BufferedImage bim = pdfRenderer.renderImageWithDPI(
          page, 300, ImageType.RGB);
        ImageIOUtil.writeImage(
          bim, String.format("src/output/pdf-%d.%s", page + 1, extension), 300);
    }
    document.close();
}

Existem poucas partes importantes no código mencionado acima. Precisamos usarPDFRenderer, a fim de renderizar PDF comoBufferedImage. Além disso, cada página do arquivo PDF precisa ser renderizada separadamente.

Finalmente, usamosImageIOUtil, do Apache PDFBox Tools, para escrever uma imagem, com a extensão que especificamos. Os formatos de arquivo possíveis sãojpeg, jpg, gif, tiff oupng.

Note that Apache PDFBox is an advanced tool - podemos criar nossos próprios arquivos PDF do zero, preencher formulários dentro do arquivo PDF, assinar e / ou criptografar o arquivo PDF.

4.2. Imagem para PDF

Vamos dar uma olhada no exemplo de código:

private static void generatePDFFromImage(String filename, String extension) {
    Document document = new Document();
    String input = filename + "." + extension;
    String output = "src/output/" + extension + ".pdf";
    FileOutputStream fos = new FileOutputStream(output);

    PdfWriter writer = PdfWriter.getInstance(document, fos);
    writer.open();
    document.open();
    document.add(Image.getInstance((new URL(input))));
    document.close();
    writer.close();
}

Please note, that we can provide an image as a file, or load it from URL, as it is shown in the example above. Além disso, as extensões do arquivo de saída que podemos usar sãojpeg, jpg, gif, tiff oupng.

5. PDF to Text Conversions

Para extrair o texto bruto de um arquivo PDF, também usaremosApache PDFBox novamente. Para conversão de texto em PDF, usaremosiText.

5.1. PDF para Texto

Criamos um método chamadogenerateTxtFromPDF(…) e o dividimos __ em três partes principais: carregamento do arquivo PDF, extração do texto e criação do arquivo final.

Vamos começar com a parte de carregamento:

File f = new File(filename);
String parsedText;
PDFParser parser = new PDFParser(new RandomAccessFile(f, "r"));
parser.parse();

Para ler um arquivo PDF, usamosPDFParser, com uma opção “r” (ler). Além disso, precisamos usar o métodoparser.parse() que fará com que o PDF seja analisado como um fluxo e populado no objetoCOSDocument.

Vamos dar uma olhada na parte de extração do texto:

COSDocument cosDoc = parser.getDocument();
PDFTextStripper pdfStripper = new PDFTextStripper();
PDDocument pdDoc = new PDDocument(cosDoc);
parsedText = pdfStripper.getText(pdDoc);

Na primeira linha, salvaremosCOSDocument dentro da variávelcosDoc. Ele será então usado para construirPDocument, que é a representação na memória do documento PDF. Finalmente, usaremosPDFTextStripper para retornar o texto bruto de um documento. Depois de todas essas operações, precisaremos usar o métodoclose() para fechar todos os fluxos usados.

Na última parte, salvaremos o texto no arquivo recém-criado usando o JavaPrintWriter simples:

PrintWriter pw = new PrintWriter("src/output/pdf.txt");
pw.print(parsedText);
pw.close();

Observe que você não pode preservar a formatação em um arquivo de texto simples porque ele contém apenas texto.

5.2. Texto para PDF

Converter arquivos de texto em PDF é um pouco complicado. In order to maintain the file formatting, you’ll need to apply additional rules.

No exemplo a seguir, não estamos levando em consideração a formatação do arquivo.

Primeiro, precisamos definir o tamanho do arquivo PDF, versão e arquivo de saída. Vamos dar uma olhada no exemplo de código:

Document pdfDoc = new Document(PageSize.A4);
PdfWriter.getInstance(pdfDoc, new FileOutputStream("src/output/txt.pdf"))
  .setPdfVersion(PdfWriter.PDF_VERSION_1_7);
pdfDoc.open();

Na próxima etapa, vamos definir a fonte e também o comando que é usado para gerar o novo parágrafo:

Font myfont = new Font();
myfont.setStyle(Font.NORMAL);
myfont.setSize(11);
pdfDoc.add(new Paragraph("\n"));

Por fim, adicionaremos parágrafos ao arquivo PDF recém-criado:

BufferedReader br = new BufferedReader(new FileReader(filename));
String strLine;
while ((strLine = br.readLine()) != null) {
    Paragraph para = new Paragraph(strLine + "\n", myfont);
    para.setAlignment(Element.ALIGN_JUSTIFIED);
    pdfDoc.add(para);
}
pdfDoc.close();
br.close();

6. PDF to Docx Conversions

Criar um arquivo PDF a partir de um documento do Word não é fácil e não abordaremos esse tópico aqui. Recomendamos bibliotecas de terceiros para fazer isso, comojWordConvert.

Para criar um arquivo do Microsoft Word a partir de um PDF, precisamos de duas bibliotecas. Ambas as bibliotecas são de código aberto. O primeiro éiTexte serve para extrair o texto de um arquivo PDF. O segundo éPOI e é usado para criar o documento.docx.

Vamos dar uma olhada no snippet de código da parte de carregamento do PDF:

XWPFDocument doc = new XWPFDocument();
String pdf = filename;
PdfReader reader = new PdfReader(pdf);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);

Após o carregamento do PDF, precisamos ler e renderizar cada página separadamente no loop e, em seguida, gravar no arquivo de saída:

for (int i = 1; i <= reader.getNumberOfPages(); i++) {
    TextExtractionStrategy strategy =
      parser.processContent(i, new SimpleTextExtractionStrategy());
    String text = strategy.getResultantText();
    XWPFParagraph p = doc.createParagraph();
    XWPFRun run = p.createRun();
    run.setText(text);
    run.addBreak(BreakType.PAGE);
}
FileOutputStream out = new FileOutputStream("src/output/pdf.docx");
doc.write(out);
// Close all open files

Observe que, com a estratégia de extraçãoSimpleTextExtractionStrategy(), perderemos todas as regras de formatação. Para consertar, brinque com as estratégias de extração descritas emhere, para obter uma solução mais complexa.

7. PDF to X Commercial Libraries

Nas seções anteriores, descrevemos bibliotecas de código aberto. Existem poucas bibliotecas que valem a pena notar, mas são pagas:

  • jPDFImages - jPDFImages pode criar imagens de páginas em um documento PDF e exportá-las como imagens JPEG, TIFF ou PNG.

  • JPEDAL - JPedal é uma biblioteca Java PDF nativa, desenvolvida ativamente e muito capaz, usada para impressão, visualização e conversão de arquivos

  • pdfcrowd - é outra biblioteca de conversão de Web / HTML para PDF e PDF para Web / HTML, com interface gráfica de usuário avançada

8. Conclusion

Neste artigo, discutimos as maneiras deconvert PDF file into various formats.

A implementação completa deste tutorial pode ser encontrada emthe GitHub project - este é um projeto baseado em Maven. Para testar, basta executar os exemplos e ver os resultados na pastaoutput.