Conserva el formato original de PDF para ver documentos traducidos con Amazon Textract, Amazon Translate y PDFBox.

Keep the original PDF format to view documents translated with Amazon Textract, Amazon Translate, and PDFBox.

Las empresas de diferentes industrias crean, escanean y almacenan grandes volúmenes de documentos PDF. En muchos casos, el contenido es rico en texto y a menudo está escrito en un idioma diferente y requiere traducción. Para abordar esto, se necesita una solución automatizada para extraer el contenido de estos PDF y traducirlos de manera rápida y rentable.

Muchas empresas tienen usuarios globales diversos y necesitan traducir texto para facilitar la comunicación entre diferentes idiomas. Esto requiere un esfuerzo humano manual, lento y costoso. Existe la necesidad de encontrar una solución escalable, confiable y rentable para traducir documentos sin perder el formato original del documento.

Para sectores como el de la salud, debido a requisitos regulatorios, los documentos traducidos requieren de la validación adicional de un ser humano para verificar la validez del documento traducido por una máquina.

Si el documento traducido no conserva el formato y la estructura original, pierde su contexto. Esto puede dificultar que un revisor humano valide y realice correcciones.

En esta publicación, demostramos cómo crear un nuevo PDF traducido a partir de un PDF escaneado conservando la estructura y el formato original del documento utilizando un enfoque basado en geometría con Amazon Textract, Amazon Translate y Apache PDFBox.

Descripción general de la solución

La solución presentada en esta publicación utiliza los siguientes componentes:

  • Amazon Textract: un servicio de aprendizaje automático (ML) completamente administrado que extrae automáticamente texto impreso, escritura a mano y otros datos de documentos escaneados. Va más allá del reconocimiento óptico de caracteres (OCR) simple para identificar, comprender y extraer datos de formularios y tablas. Amazon Textract puede detectar texto en una variedad de documentos, incluidos informes financieros, registros médicos y formularios fiscales.
  • Amazon Translate: un servicio de traducción neuronal que ofrece traducciones de alta calidad, rápidas y asequibles. Amazon Translate proporciona capacidades de traducción a pedido y por lotes de alta calidad en más de 2.970 pares de idiomas, al mismo tiempo que reduce los costos de traducción.
  • PDF Translate: una biblioteca de código abierto escrita en Java y publicada en AWS Samples en GitHub. Esta biblioteca contiene la lógica para generar documentos PDF traducidos en el idioma deseado con Amazon Textract y Amazon Translate. También utiliza la biblioteca de código abierto Java Apache PDFBox para crear documentos PDF. Hay bibliotecas de procesamiento de PDF similares disponibles en otros lenguajes de programación, por ejemplo, Node PDFBox.

Mientras se realizan traducciones automáticas, puede haber situaciones en las que desee conservar secciones específicas de texto sin traducir, como nombres o identificadores únicos. Amazon Translate permite modificaciones de etiquetas, lo que le permite especificar qué texto no debe traducirse. Amazon Translate también admite personalización de formalidad, lo que le permite personalizar el nivel de formalidad en la salida de su traducción.

Para obtener detalles sobre los límites de Amazon Textract, consulte las cuotas en Amazon Textract.

La solución está restringida a los idiomas que se pueden extraer con Amazon Textract, que actualmente admite inglés, español, italiano, portugués, francés y alemán. Estos idiomas también son compatibles con Amazon Translate. Consulte la lista completa de idiomas admitidos por Amazon Translate en Supported languages and language codes.

Utilizamos el siguiente PDF para demostrar cómo traducir el texto del inglés al español. La solución también admite generar el documento traducido sin ningún formato. Se mantiene la posición del texto traducido. Los documentos PDF de origen y traducidos también se pueden encontrar en el repositorio de AWS Samples en GitHub.

En las siguientes secciones, demostramos cómo ejecutar el código de traducción en una máquina local y examinar el código de traducción con más detalle.

Prerrequisitos

Antes de comenzar, configure su cuenta de AWS y la Interfaz de línea de comandos de AWS (AWS CLI). Para acceder a los servicios de AWS como Textract y Translate, se necesitan los permisos IAM adecuados. Recomendamos utilizar permisos de privilegio mínimo. Para obtener más información sobre los permisos IAM, consulte Políticas y permisos en IAM, así como Cómo funciona Amazon Textract con IAM y Cómo funciona Amazon Translate con IAM.

Ejecute el código de traducción en una máquina local

Esta solución se centra en el código Java independiente para extraer y traducir un documento PDF. Esto es para facilitar las pruebas y personalizaciones para obtener el mejor documento PDF traducido renderizado. Luego, el código se puede integrar en una solución automatizada para implementar y ejecutar en AWS. Consulte Translating PDF documents using Amazon Translate and Amazon Textract para ver una arquitectura de muestra que utiliza Amazon Simple Storage Service (Amazon S3) para almacenar los documentos y AWS Lambda para ejecutar el código.

Para ejecutar el código en una máquina local, completa los siguientes pasos. Los ejemplos de código están disponibles en el repositorio de GitHub.

  1. Clona el repositorio de GitHub:

    git clone https://github.com/aws-samples/amazon-translate-pdf
  2. Ejecuta el siguiente comando:

    cd amazon-translate-pdf
  3. Ejecuta el siguiente comando para traducir de inglés a español:

    java -jar target/translate-pdf-1.0.jar --source en --translated es

Se crearán dos documentos PDF traducidos en la carpeta de documentos, uno con y otro sin el formato original (SampleOutput-es.pdf y SampleOutput-min-es.pdf).

Código para generar el PDF traducido

Los siguientes fragmentos de código muestran cómo tomar un documento PDF y generar un documento PDF traducido correspondiente. Extrae el texto usando Amazon Textract y crea el PDF traducido agregando el texto traducido como una capa en la imagen. Se basa en la solución mostrada en la publicación Generando PDFs buscables automáticamente a partir de documentos escaneados con Amazon Textract.

El código primero obtiene cada línea de texto con Amazon Textract. Se utiliza Amazon Translate para obtener el texto traducido y guardar la geometría del texto traducido.

Región región = Región.US_EAST_1;
TextractClient textractClient = TextractClient.builder()
        .región(región)
        .construir();

// Obtén el objeto Document de entrada como bytes
Document pdfDoc = Document.builder()
        .bytes(SdkBytes.fromByteBuffer(imageBytes))
        .construir();

TranslateClient translateClient = TranslateClient.builder()
        .región(región)
        .construir();

DetectDocumentTextRequest detectDocumentTextRequest = DetectDocumentTextRequest.builder()
        .documento(pdfDoc)
        .construir();

// Invoca la operación Detect
DetectDocumentTextResponse textResponse = textractClient.detectDocumentText(detectDocumentTextRequest);

List<Block> blocks = textResponse.blocks();
List<TextLine> lines = new ArrayList<>();
BoundingBox boundingBox;

for (Block block : blocks) {
    if ((block.blockType()).equals(BlockType.LINE)) {
        String source = block.text();

        TranslateTextRequest requestTranslate = TranslateTextRequest.builder()
                .sourceLanguageCode(sourceLanguage)
                .targetLanguageCode(destinationLanguage)
                .text(source)
                .construir();

        TranslateTextResponse resultTranslate = translateClient.translateText(requestTranslate);

        boundingBox = block.geometry().boundingBox();
        lines.add(new TextLine(boundingBox.left(),
                boundingBox.top(),
                boundingBox.width(),
                boundingBox.height(),
                resultTranslate.translatedText(),
                source));
    }
}
return lines;

El tamaño de la fuente se calcula de la siguiente manera y se puede configurar fácilmente:

int fontSize = 20;
float textWidth = font.getStringWidth(text) / 1000 * fontSize;
float textHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
 
if (textWidth > bbWidth) {
    while (textWidth > bbWidth) {
        fontSize -= 1;
        textWidth = font.getStringWidth(text) / 1000 * fontSize;
        textHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
     }
} else if (textWidth < bbWidth) {
     while (textWidth < bbWidth) {
         fontSize += 1;
         textWidth = font.getStringWidth(text) / 1000 * fontSize;
         textHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
      }
}

El PDF traducido se crea a partir de la geometría guardada y el texto traducido. Los cambios en el color del texto traducido se pueden configurar fácilmente.

float width = image.getWidth();
float height = image.getHeight();
 
PDRectangle box = new PDRectangle(width, height);
PDPage page = new PDPage(box);
page.setMediaBox(box);
this.document.addPage(page); //org.apache.pdfbox.pdmodel.PDDocument
 
PDImageXObject pdImage;
 
if(imageType == ImageType.JPEG){
    pdImage = JPEGFactory.createFromImage(this.document, image);
} else {
    pdImage = LosslessFactory.createFromImage(this.document, image);
}
 
PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.OVERWRITE, false);
 
contentStream.drawImage(pdImage, 0, 0);
contentStream.setRenderingMode(RenderingMode.FILL);
 
for (TextLine cline : lines){
    String clinetext = cline.text;
    String clinetextOriginal = cline.originalText;
                       
    FontInfo fontInfo = calculateFontSize(clinetextOriginal, (float) cline.width * width, (float) cline.height * height, font);
    //config to include original document structure - overlay with original
    contentStream.setNonStrokingColor(Color.WHITE);
    contentStream.addRect((float) cline.left * width, (float) (height - height * cline.top - fontInfo.textHeight), (float) cline.width * width, (float) cline.height * height);
    contentStream.fill();
 
    fontInfo = calculateFontSize(clinetext, (float) cline.width * width, (float) cline.height * height, font);
    //config to include original document structure - overlay with translated
    contentStream.setNonStrokingColor(Color.WHITE);
    contentStream.addRect((float) cline.left * width, (float) (height - height * cline.top - fontInfo.textHeight), (float) cline.width * width, (float) cline.height * height);
    contentStream.fill();
    //change the output text color here
    fontInfo = calculateFontSize(clinetext.length() <= clinetextOriginal.length() ? clinetextOriginal : clinetext, (float) cline.width * width, (float) cline.height * height, font);
    contentStream.setNonStrokingColor(Color.BLACK);
    contentStream.beginText();
    contentStream.setFont(font, fontInfo.fontSize);
    contentStream.newLineAtOffset((float) cline.left * width, (float) (height - height * cline.top - fontInfo.textHeight));
    contentStream.showText(clinetext);
    contentStream.endText();
}
contentStream.close()

La siguiente imagen muestra el documento traducido al español con el formato original (SampleOutput-es.pdf).

La siguiente imagen muestra el PDF traducido al español sin ningún formato (SampleOutput-min-es.pdf).

Tiempo de procesamiento

La solicitud de empleo en PDF tomó aproximadamente 10 segundos para extraer, procesar y mostrar el PDF traducido. El tiempo de procesamiento para un documento con mucho texto, como la Declaración de Independencia en PDF, tomó menos de un minuto.

Costo

Con Amazon Textract, pagas según la cantidad de páginas e imágenes procesadas. Con Amazon Translate, pagas según la cantidad de caracteres de texto procesados. Consulta los precios de Amazon Textract y Amazon Translate para conocer los costos reales.

Conclusión

Esta publicación mostró cómo usar Amazon Textract y Amazon Translate para generar documentos PDF traducidos manteniendo la estructura del documento original. Opcionalmente, puedes posprocesar los resultados de Amazon Textract para mejorar la calidad de la traducción, por ejemplo, las palabras extraídas pueden pasar por verificadores ortográficos basados en ML como SymSpell para validación de datos, o se pueden utilizar algoritmos de agrupación para preservar el orden de lectura. También puedes usar Amazon Augmented AI (Amazon A2I) para crear flujos de trabajo de revisión humana donde puedes utilizar tu propio equipo de trabajo privado para revisar los documentos PDF originales y traducidos y proporcionar más precisión y contexto. Consulta los recursos Diseño de flujos de trabajo de revisión humana con Amazon Translate y Amazon Augmented AI y Creación de un flujo de trabajo de traducción de documentos multilingües con personalización específica de dominio y de idioma para comenzar.