需求:替换PDF中的文本为等长的空字符串
测试代码:
public static void main(String[] args) {
// 输入输出路径
String inputPdfPath = "C:\\Users\\lijiabao\\Downloads\\11.网站合同-无锡 (1).pdf";
String outputPdfPath = "C:\\Users\\lijiabao\\Downloads\\11.网站合同-无锡 (1)1111.pdf";
String targetText = "[[张三签署位置]]";
// 加载PDF文档(需确保Aspose.PDF许可证已配置,否则会有水印)
Document document = new Document(inputPdfPath);
// 遍历所有页面,查找并替换文本
for (Page page : document.getPages()) {
// 创建文本吸收器,设置搜索选项(全字匹配、区分大小写等)
TextFragmentAbsorber absorber = new TextFragmentAbsorber(targetText);
absorber.getTextSearchOptions().setSearchForTextRelatedGraphics(false); // 不搜索图形相关文本
// 吸收页面中的文本片段
page.accept(absorber);
// 获取所有匹配的文本片段
TextFragmentCollection textFragments = absorber.getTextFragments();
// 遍历片段并替换
for (TextFragment fragment : textFragments) {
// 1. 获取原文本的字体、字号和宽度
TextState originalState = fragment.getTextState();
float originalWidth = (float) fragment.getRectangle().getWidth(); // 原文本宽度
// float originalWidth = measureExactOriginalWidth(fragment, page);
// 2. 计算单个空格的宽度(使用原文本的字体和字号)
TextFragment tempSpace = new TextFragment(" ");
tempSpace.getTextState().setFont(originalState.getFont());
tempSpace.getTextState().setFontSize(originalState.getFontSize());
float spaceWidth = (float) tempSpace.getRectangle().getWidth();
int spaceCount = (int) Math.ceil(originalWidth / spaceWidth);
String replacement = " ".repeat(spaceCount);
/* // 3. 计算所需空格数量(向上取整,确保宽度匹配)
int spaceCount = (int) Math.ceil(originalWidth / spaceWidth);
String replacement = " ".repeat(spaceCount); // 生成对应数量的空格*/
// 4. 替换文本,并保持原格式(关键!否则替换后格式会丢失)
fragment.setText(replacement);
// 强制继承原文本的字体、字号、颜色等样式(避免Aspose自动调整)
fragment.getTextState().setFont(originalState.getFont());
fragment.getTextState().setFontSize(originalState.getFontSize());
fragment.getTextState().setForegroundColor(originalState.getForegroundColor());
}
}
// 保存替换后的文档
document.save(outputPdfPath);
document.close();
System.out.println("替换完成,宽度匹配原文本");
}
目前的问题:文本【张三签署位置】替换为空字符串后,空字符串的长度和原来的文本【张三签署位置】长度不一致。
麻烦帮看下是否有更准确的替换方法