public static void extRactAndReplaceText(String src, PnBatteryRegister pnBatteryRegister) {
logger.info("开始提取和替换文本。");
Map<String, String> replacements = generateReplacements(pnBatteryRegister);
String batterySpecification = safeGetString(pnBatteryRegister.getBatterySpecification());
String[] specs = batterySpecification.split(",");
Set<String> seenSpecs = new HashSet<>();
List<String> uniqueSpecs = new ArrayList<>();
for (String spec : specs) {
String trimmedSpec = spec.trim();
if (!trimmedSpec.isEmpty() && seenSpecs.add(trimmedSpec)) {
uniqueSpecs.add(trimmedSpec);
}
}
logger.info("处理电池规格: {}", uniqueSpecs);
processBatterySpecifications(uniqueSpecs, replacements);
String path = AwsUtil.getSubPath("8", "en");
String filename = generateFilenameWithDate();
String s3Key = path + '/' + filename;
String fileUrl = Constants.RESOURCE_PREFIX + '/' + path + '/' + filename;
String tempFile = PaiNengConfig.getDownloadPath() + "temp.pdf";
logger.info("准备下载 PDF,源 URL: {}", src);
PdfDocument pdf = null;
try {
pdf = new PdfDocument();
InputStream pdfInputStream = new UrlResource(src).getInputStream();
pdf.loadFromStream(pdfInputStream);
pdfInputStream.close();
logger.info("PDF 成功加载。");
// 添加附录页
if (uniqueSpecs.size() > 3) {
logger.info("添加附录页,因为规格数量超过 3。");
// 2. 设置页面边距
PdfMargins margin = new PdfMargins(90);
PdfPageBase page = pdf.getPages().add(PdfPageSize.A4, margin);
// 3. 设置字体
PdfTrueTypeFont titleFont = new PdfTrueTypeFont(new Font("Hind", Font.BOLD, 12));
// 3. 绘制标题
PdfBrush brush = PdfBrushes.getBlack();
String title = RegisterConstants.KEY_TITLE;
page.getCanvas().drawString(title, titleFont, brush, 10, 20);
// 4. 绘制项目列表
float y = 40;
PdfOrderedMarker marker = new PdfOrderedMarker(PdfNumberStyle.Numeric, titleFont);
PdfSortedList list = new PdfSortedList(String.join("\n", uniqueSpecs)); // 使用 uniqueSpecs 数据
list.setFont(titleFont);
list.setIndent(2);
list.setTextIndent(4);
list.setBrush(brush);
list.setMarker(marker);
list.draw(page, 10, y);
}
// 替换文本
logger.info("开始替换 PDF 中的文本。");
// 确保 PDF 至少有一页
if (pdf.getPages().getCount() > 0) {
PdfPageBase pdfPage = pdf.getPages().get(0); // 获取第一页
PdfTextReplacer textReplacer = new PdfTextReplacer(pdfPage);
// 遍历替换项,进行批量替换
for (Map.Entry<String, String> entry : replacements.entrySet()) {
textReplacer.replaceAllText(entry.getKey(), entry.getValue());
}
}
// 保存 PDF 到本地文件
pdf.saveToFile(tempFile);
logger.info("PDF 成功保存到本地文件。");
logger.info("开始上传 PDF 到 S3,目标 key: {}", s3Key);
uploadToS3WithTransferManager(new File(tempFile), s3Key);
// 设置文件 URL
pnBatteryRegister.setFile(fileUrl);
logger.info("设置文件 URL: {}", fileUrl);
} catch (Exception e) {
logger.error("处理过程中发生错误: {}", e.getMessage(), e);
throw new ServiceException("处理过程中发生错误");
} finally {
// 确保在最后关闭 PdfTrueTypeFont 对象(如果它不为 null)
if (pdf != null) {
// 记录释放前的内存
logMemoryUsage("释放 PDF 资源前");
pdf.dispose(); // 手动释放资源
logger.info("PDF 资源已释放。");
// 记录释放后的内存
logMemoryUsage("释放 PDF 资源后");
}
}
}