Saltar al contenido

Busque y reemplace el texto del marcador de posición en PDF con Python

Solución:

No hay una forma directa de hacer esto que funcione de manera confiable. Los PDF no son como HTML: especifican la posición del texto carácter por carácter. Es posible que ni siquiera incluyan toda la fuente utilizada para representar el texto, solo los caracteres necesarios para representar el texto específico en el documento. Ninguna biblioteca que he encontrado hará cosas buenas como volver a ajustar los párrafos después de actualizar el texto. Los PDF son en su mayor parte un formato de solo visualización, por lo que será mucho mejor usar una herramienta que convierta el marcado en un PDF que actualizar el PDF en el lugar.

Si esa no es una opción, puede crear un formulario PDF en algo como Acrobat, luego usar una biblioteca de manipulación de PDF como iText (AGPL) o pdfbox, que tiene un buen contenedor de clojure llamado pdfboxing que puede manejar algo de eso.

Desde mi experiencia, el soporte de Python para escribir en archivos PDF es bastante limitado. Java tiene, de lejos, el mejor soporte de idiomas. Además, obtiene lo que paga, por lo que probablemente valdría la pena pagar por una licencia de iText si la usa con fines comerciales. He tenido muy buenos resultados escribiendo envoltorios de Python alrededor de herramientas CLI de manipulación de PDF como pdfboxing y ghostscript. Probablemente será mucho más fácil para su caso de uso que intentar calzar esto en el ecosistema PDF de Python.

No hay una solución definitiva, pero encontré 2 soluciones que funcionan la mayor parte del tiempo.

En python https://github.com/JoshData/pdf-redactor da buenos resultados. Aquí está el código de ejemplo:

# Redact things that look like social security numbers, replacing the
# text with X's.
options.content_filters = [
        # First convert all dash-like characters to dashes.
        (
                re.compile(u"Tom Xavier"),
                lambda m : "XXXXXXX"
        ),

        # Then do an actual SSL regex.
        # See https://github.com/opendata/SSN-Redaction for why this regex is complicated.
        (
                re.compile(r"(?<!d)(?!666|000|9d{2})([OoIli0-9]{3})([s-]?)(?!00)([OoIli0-9]{2})2(?!0{4})([OoIli0-9]{4})(?!d)"),
                lambda m : "XXX-XX-XXXX"
        ),
]

# Perform the redaction using PDF on standard input and writing to standard output.
pdf_redactor.redactor(options)

El ejemplo completo se puede encontrar aquí

En ruby ​​https://github.com/gettalong/hexapdf funciona para texto en negro. Código de ejemplo:

require 'hexapdf'

class ShowTextProcessor < HexaPDF::Content::Processor

  def initialize(page, to_hide_arr)
    super()
    @canvas = page.canvas(type: :overlay)
    @to_hide_arr = to_hide_arr
  end

  def show_text(str)
    boxes = decode_text_with_positioning(str)
    return if boxes.string.empty?
    if @to_hide_arr.include? boxes.string
        @canvas.stroke_color(0, 0 , 0)

        boxes.each do |box|
          x, y = *box.lower_left
          tx, ty = *box.upper_right
          @canvas.rectangle(x, y, tx - x, ty - y).fill
        end
    end

  end
  alias :show_text_with_positioning :show_text

end

file_name = ARGV[0]
strings_to_black = ARGV[1].split("|")

doc = HexaPDF::Document.open(file_name)
puts "Blacken strings [#{strings_to_black}], inside [#{file_name}]."
doc.pages.each.with_index do |page, index|
  processor = ShowTextProcessor.new(page, strings_to_black)
  page.process_contents(processor)
end

new_file_name = "#{file_name.split('.').first}_updated.pdf"
doc.write(new_file_name, optimize: true)

puts "Writing updated file [#{new_file_name}]."

En esto, puede ocultar el texto en el texto seleccionado que será visible.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *