Primeiros passos com o PDF Oxide (Ruby)
O PDF Oxide é a biblioteca PDF mais rápida do Ruby — extração de texto com média de 0,8ms e 100% de aprovação em 3.830 PDFs. Uma única gem para extrair, buscar, converter, criar e tarjar PDFs, construída sobre o mesmo núcleo em Rust que move os bindings de Python, Java, Node, Go, C# e PHP.
Instalação
gem install pdf_oxide
Ou adicione ao seu Gemfile:
gem 'pdf_oxide', '~> 0.3'
A biblioteca nativa libpdf_oxide pré-compilada já vem embutida na gem com tag de plataforma — não é preciso compilador nem instalação no sistema. As gems pré-compiladas cobrem Ruby 3.1–3.4 em x86_64-linux, aarch64-linux, macOS Intel e Apple Silicon, e Windows (x64-mingw-ucrt).
Abrindo um PDF
Use PdfDocument.open para carregar um arquivo. A forma com bloco fecha o documento automaticamente quando o bloco retorna; #close também está disponível e é idempotente.
require 'pdf_oxide'
PdfOxide::PdfDocument.open('research-paper.pdf') do |doc|
puts "Pages: #{doc.page_count}"
puts "PDF version: #{doc.pdf_version}"
puts "Encrypted: #{doc.encrypted?}"
end
Para documentos criptografados, passe password::
PdfOxide::PdfDocument.open('confidential.pdf', password: 'secret') do |doc|
puts doc.extract_text(0)
end
Você também pode abrir a partir de bytes em memória — útil ao receber dados via streaming do S3, HTTP ou de um banco de dados. O PdfDocument.open detecta automaticamente os bytes brutos de um PDF pelo cabeçalho mágico %PDF-:
bytes = File.binread('report.pdf')
PdfOxide::PdfDocument.open(bytes) do |doc|
puts doc.extract_text(0)
end
Extração de texto
Página única
Extraia texto puro de qualquer página pelo seu índice (começando em zero).
PdfOxide::PdfDocument.open('report.pdf') do |doc|
text = doc.extract_text(0)
puts text
end
Todas as páginas
PdfOxide::PdfDocument.open('book.pdf') do |doc|
doc.page_count.times do |i|
puts "--- Page #{i + 1} ---"
puts doc.extract_text(i)
end
end
Atalho de uma só chamada
Quando você precisa do texto de apenas uma página, PdfDocument.extract_text abre, extrai e fecha em uma única chamada:
text = PdfOxide::PdfDocument.extract_text('report.pdf', page: 0)
puts text
Extração com roteamento automático
O extract_text_auto usa o roteador automático da v0.3.51 para escolher entre o texto nativo ou OCR a cada página. Em um build sem o recurso ocr, ele recorre normalmente à camada de texto nativa — nunca levanta um erro de “OCR indisponível”.
PdfOxide::PdfDocument.open('scan.pdf') do |doc|
puts doc.extract_text_auto(0)
end
Para obter uma razão tipada que descreve a qualidade da extração, use o AutoExtractor:
PdfOxide::PdfDocument.open('scan.pdf') do |doc|
ax = doc.auto_extractor
result = ax.extract_page(0)
puts result[:text]
warn "degraded: #{result[:reason]}" unless ax.ok?(result[:reason])
end
Trabalhando com páginas
PdfDocument#page retorna uma view leve PdfPage que toma emprestado o documento. #pages retorna uma para cada página.
PdfOxide::PdfDocument.open('paper.pdf') do |doc|
page = doc.page(0)
puts "Index: #{page.index}"
puts page.text # same as doc.extract_text(0)
doc.pages.each do |p|
puts "Page #{p.index}: #{p.text.length} chars"
end
end
Conversão para Markdown e HTML
Converta uma única página (passando o índice) ou o documento inteiro (omitindo o índice) para Markdown ou HTML.
PdfOxide::PdfDocument.open('paper.pdf') do |doc|
puts doc.to_markdown(0) # first page to Markdown
puts doc.to_html(0) # first page to HTML
puts doc.to_markdown # entire document to Markdown
end
Extração estruturada
extract_structured retorna o layout da página já interpretado como um Hash — dimensões da página mais regiões tipadas com texto, caixas delimitadoras e índices de coluna.
PdfOxide::PdfDocument.open('paper.pdf') do |doc|
page = doc.extract_structured(0)
puts "Size: #{page['page_width']} x #{page['page_height']}"
page['regions'].each do |region|
puts "#{region['kind']}: #{region['text']}"
end
end
Busca
search percorre o documento inteiro e retorna um array de hashes de correspondência, cada um com :page, :text e um hash :bbox com :x, :y, :width e :height.
PdfOxide::PdfDocument.open('manual.pdf') do |doc|
matches = doc.search('configuration', case_sensitive: false)
matches.each do |m|
bbox = m[:bbox]
puts "Page #{m[:page]}: '#{m[:text]}' at (#{bbox[:x].round}, #{bbox[:y].round})"
end
end
Renderização
Renderize uma página em bytes PNG a uma determinada resolução (DPI):
PdfOxide::PdfDocument.open('poster.pdf') do |doc|
png = doc.render(0, dpi: 150)
File.binwrite('page-0.png', png)
end
Criação de PDF
A classe Pdf cria PDFs a partir de Markdown, HTML ou texto puro. As instâncias detêm um handle nativo; use a forma com bloco (que fecha automaticamente) ou chame #close você mesmo.
PdfOxide::Pdf.from_markdown("# Hello World\n\nThis is a PDF.") do |pdf|
pdf.save('output.pdf')
end
PdfOxide::Pdf.from_html('<h1>Invoice</h1><p>Amount due: $42.00</p>') do |pdf|
pdf.save('invoice.pdf')
end
PdfOxide::Pdf.from_text("Plain text document.\n\nSecond paragraph.") do |pdf|
pdf.save('notes.pdf')
end
Pegue os bytes em vez de salvar em disco com #to_bytes:
pdf_bytes = PdfOxide::Pdf.from_markdown('# Report').to_bytes
# upload pdf_bytes, attach to an email, etc.
Tarjamento (redaction)
DocumentEditor abre um PDF existente para tarjamento destrutivo. apply_redactions! remove permanentemente o conteúdo coberto e pode limpar os metadados do documento na mesma passagem.
PdfOxide::DocumentEditor.open('source.pdf') do |ed|
ed.add_redaction(page: 0, rect: [100, 200, 300, 250])
ed.apply_redactions!(scrub_metadata: true)
ed.save_to('redacted.pdf')
end
Tratamento de erros
O PDF Oxide levanta subclasses tipadas de PdfOxide::Error para falhas específicas de PDF.
begin
PdfOxide::PdfDocument.open('document.pdf') do |doc|
puts doc.extract_text(0)
end
rescue PdfOxide::FileNotFoundError
warn 'File not found'
rescue PdfOxide::EncryptedError
warn 'Wrong or missing password'
rescue PdfOxide::ParseError => e
warn "Malformed PDF: #{e.message}"
rescue PdfOxide::Error => e
warn "PDF error: #{e.message}"
end
Próximos passos
- Primeiros passos com Python – usando o PDF Oxide a partir do Python
- Primeiros passos com Rust – usando o PDF Oxide a partir do Rust
- Extração de texto – opções e receitas detalhadas de extração
- Criação de PDF – criação avançada, criptografia e metadados
- Edição – modificando PDFs existentes, anotações e campos de formulário