Press "Enter" to skip to content

保留原始PDF格式,使用Amazon Textract、Amazon Translate和PDFBox查看翻译后的文档

各行业的公司创建、扫描和存储大量的PDF文档。在许多情况下,内容是以文字为主,并且通常是用不同的语言编写的,需要翻译。为了解决这个问题,您需要一个自动化的解决方案来快速、经济高效地提取这些PDF中的内容并进行翻译。

许多企业拥有多样化的全球用户,需要翻译文本以实现跨语言沟通。这是一项手工、缓慢和昂贵的人力工作。需要找到一种可扩展、可靠且具有成本效益的解决方案,以在保留原始文档格式的同时翻译文档。

对于像医疗保健这样的行业,由于监管要求,翻译后的文档需要额外的人工参与来验证机器翻译的有效性。

如果翻译后的文档没有保留原始的格式和结构,就会失去上下文。这会使人类审阅者难以验证和纠正。

在本文中,我们演示了如何使用基于几何的方法与Amazon Textract、Amazon Translate和Apache PDFBox创建一个新的翻译后的PDF,同时保留原始的文档结构和格式。

解决方案概述

本文介绍的解决方案使用以下组件

  • Amazon Textract – 一种全面托管的机器学习(ML)服务,可以自动从扫描文档中提取印刷文字、手写文字和其他数据,不仅限于简单的光学字符识别(OCR),还可以识别、理解并提取表单和表格中的数据。Amazon Textract可以检测各种文档中的文本,包括财务报告、医疗记录和税务表格。
  • Amazon Translate – 一种神经网络机器翻译服务,提供快速、高质量和经济实惠的语言翻译。Amazon Translate提供按需和批量翻译能力,支持超过2,970种语言对,同时降低您的翻译成本。
  • PDF Translate – 一个开源库,使用Java编写并在AWS Samples的GitHub上发布。该库包含了使用Amazon Textract和Amazon Translate在您所需的语言中生成翻译后的PDF文档的逻辑。它还使用开源的Java库Apache PDFBox来创建PDF文档。其他编程语言中也有类似的PDF处理库,例如Node PDFBox。

在进行机器翻译时,您可能会遇到希望保留特定文本部分不进行翻译的情况,比如姓名或唯一标识符。Amazon Translate允许标签修改,可以指定哪些文本不应进行翻译。Amazon Translate还支持形式自定义,可以自定义翻译输出的形式水平。

有关Amazon Textract限制的详细信息,请参阅Amazon Textract的配额。

该解决方案仅限于可以由Amazon Textract提取的语言,目前支持英语、西班牙语、意大利语、葡萄牙语、法语和德语。这些语言也受到Amazon Translate的支持。有关Amazon Translate支持的语言的完整列表,请参阅支持的语言和语言代码。

我们使用以下PDF文件来演示将文本从英语翻译为西班牙语。该解决方案还支持生成没有任何格式的翻译文档。翻译后的文本的位置保持不变。源PDF和翻译后的PDF文档也可以在AWS Samples的GitHub存储库中找到。

在接下来的章节中,我们将演示如何在本地计算机上运行翻译代码,并更详细地查看翻译代码。

保留原始PDF格式,使用Amazon Textract、Amazon Translate和PDFBox查看翻译后的文档 AI 新闻 第1张

先决条件

在开始之前,请设置您的AWS帐户和AWS命令行界面(AWS CLI)。要访问任何AWS服务,如Textract和Translate,需要适当的IAM权限。我们建议使用最低权限原则。要了解更多关于IAM权限的信息,请参阅IAM中的策略和权限以及Amazon Textract与IAM的配合使用以及Amazon Translate与IAM的配合使用。

在本地计算机上运行翻译代码

本解决方案侧重于独立的Java代码,用于提取和翻译PDF文档。这是为了更方便地进行测试和自定义,以获得最佳渲染的翻译后的PDF文档。然后可以将代码集成到自动化解决方案中,在AWS中部署和运行。有关使用Amazon Simple Storage Service(Amazon S3)存储文档并使用AWS Lambda运行代码的示例架构,请参阅使用Amazon Translate和Amazon Textract翻译PDF文档。

要在本地计算机上运行代码,请按照以下步骤完成。 代码示例可在GitHub存储库上获取。

  1. 克隆GitHub存储库:

    git clone https://github.com/aws-samples/amazon-translate-pdf
  2. 运行以下命令:

    cd amazon-translate-pdf
  3. 运行以下命令从英语翻译为西班牙语:

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

在“documents”文件夹中创建了两个已翻译的PDF文档,一个包含原始格式,一个不包含 (SampleOutput-es.pdfSampleOutput-min-es.pdf)。

生成翻译PDF的代码

以下代码片段显示了如何获取PDF文档并生成相应的翻译PDF文档。 它使用Amazon Textract提取文本,然后将翻译后的文本作为图像的一层添加到翻译PDF中。 它构建在文章“使用Amazon Textract自动从扫描文档生成可搜索的PDFs”的解决方案基础上。

代码首先使用Amazon Textract获取每行文本。 使用Amazon Translate获取翻译后的文本并保存翻译后的文本的几何形状。

Region region = Region.US_EAST_1;
TextractClient textractClient = TextractClient.builder()
        .region(region)
        .build();

// 获取输入的Document对象作为字节
Document pdfDoc = Document.builder()
        .bytes(SdkBytes.fromByteBuffer(imageBytes))
        .build();

TranslateClient translateClient = TranslateClient.builder()
        .region(region)
        .build();

DetectDocumentTextRequest detectDocumentTextRequest = DetectDocumentTextRequest.builder()
        .document(pdfDoc)
        .build();

// 调用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)
                .build();

        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;

字体大小的计算方法如下,可以轻松配置:

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;
      }
}

从保存的几何形状和翻译后的文本创建了翻译PDF。 可以轻松配置翻译文本的颜色更改。

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()

下图显示了使用原始格式翻译成西班牙语的文档(SampleOutput-es.pdf)。

保留原始PDF格式,使用Amazon Textract、Amazon Translate和PDFBox查看翻译后的文档 AI 新闻 第2张

下图显示了没有任何格式的西班牙语翻译PDF(SampleOutput-min-es.pdf)。

保留原始PDF格式,使用Amazon Textract、Amazon Translate和PDFBox查看翻译后的文档 AI 新闻 第3张

处理时间

就业申请PDF大约需要10秒来提取、处理和渲染翻译后的PDF。对于文字密集的文档,如《独立宣言》PDF,处理时间少于一分钟。

费用

使用亚马逊Textract,您按照处理的页面和图像数量付费。使用亚马逊Translate,您按照处理的文本字符数量付费。有关实际费用,请参阅亚马逊Textract定价和亚马逊Translate定价。

结论

本文介绍了如何使用亚马逊Textract和亚马逊Translate生成保留原始文档结构的翻译PDF文档。您可以选择对亚马逊Textract的结果进行后处理,以提高翻译的质量,例如,提取的单词可以通过基于机器学习的拼写检查(如SymSpell)进行数据验证,或者可以使用聚类算法来保留阅读顺序。您还可以使用亚马逊增强AI(Amazon A2I)构建人工审核工作流程,在这个流程中,您可以使用自己的专属工作人员审核原始和翻译后的PDF文档,以提供更准确和全面的内容。有关开始的指南,请参阅使用亚马逊Translate和亚马逊增强AI设计人工审核工作流程和构建多语言文档翻译工作流程,进行领域特定和语言特定定制。

Leave a Reply

Your email address will not be published. Required fields are marked *