各行业的公司创建、扫描和存储大量的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存储库中找到。
在接下来的章节中,我们将演示如何在本地计算机上运行翻译代码,并更详细地查看翻译代码。
先决条件
在开始之前,请设置您的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存储库上获取。
-
克隆GitHub存储库:
git clone https://github.com/aws-samples/amazon-translate-pdf
-
运行以下命令:
cd amazon-translate-pdf
-
运行以下命令从英语翻译为西班牙语:
java -jar target/translate-pdf-1.0.jar --source en --translated es
在“documents”文件夹中创建了两个已翻译的PDF文档,一个包含原始格式,一个不包含 (SampleOutput-es.pdf
和 SampleOutput-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(SampleOutput-min-es.pdf
)。
处理时间
就业申请PDF大约需要10秒来提取、处理和渲染翻译后的PDF。对于文字密集的文档,如《独立宣言》PDF,处理时间少于一分钟。
费用
使用亚马逊Textract,您按照处理的页面和图像数量付费。使用亚马逊Translate,您按照处理的文本字符数量付费。有关实际费用,请参阅亚马逊Textract定价和亚马逊Translate定价。
结论
本文介绍了如何使用亚马逊Textract和亚马逊Translate生成保留原始文档结构的翻译PDF文档。您可以选择对亚马逊Textract的结果进行后处理,以提高翻译的质量,例如,提取的单词可以通过基于机器学习的拼写检查(如SymSpell)进行数据验证,或者可以使用聚类算法来保留阅读顺序。您还可以使用亚马逊增强AI(Amazon A2I)构建人工审核工作流程,在这个流程中,您可以使用自己的专属工作人员审核原始和翻译后的PDF文档,以提供更准确和全面的内容。有关开始的指南,请参阅使用亚马逊Translate和亚马逊增强AI设计人工审核工作流程和构建多语言文档翻译工作流程,进行领域特定和语言特定定制。