通过PDFBOX调整整页的文字/图片(不包括线条)位置或字体 仅供参考
PDDocument document = PDDocument.load(new File("原PDF文件目录"));
for (PDPage page : document.getPages()) {
float width = page.getMediaBox().getWidth();
float height = page.getMediaBox().getLowerLeftY() +
page.getMediaBox().getHeight();
//获取图片
PDResources resources = page.getResources();
Iterable<COSName> cosNames = resources.getXObjectNames();
PDImageXObject pdImageXObject = null;
if (cosNames != null) {
for (COSName cosName : cosNames) {
//根据自己需求过滤图片 或者 直接使用集合存储所有图片
if (resources.isImageXObject(cosName) &&
cosName.getName().equals("I1")) {
pdImageXObject = (PDImageXObject) resources.getXObject(cosName);
}
}
}
//可自己继承PDFTextStripper 实现文本提取
PrintTextTripper printTextTripper= new PrintTextTripper(document);
printTextTripper.setEndPage(count);
printTextTripper.setStartPage(count);
List<LineText> lineTexts = printTextTripper.process();
boolean firstFlag = true;
for (LineText lineText : lineTexts) {
//通过文本提取 获取所有字符 这里是每个字符的坐标 切记 坐标原点为左下角
for (TextPosition textPosition : lineText.getTextPositions()) {
PDPageContentStream contentStream = null;
if (firstFlag) {
contentStream = new PDPageContentStream(document, page,
PDPageContentStream.AppendMode.OVERWRITE, true);
firstFlag = false;
} else {
contentStream = new PDPageContentStream(document, page,
PDPageContentStream.AppendMode.APPEND, true);
}
contentStream.beginText();
contentStream.newLineAtOffset("X坐标", "Y坐标");
//字体及大小
contentStream.setFont(textPosition.getFont(), textPosition.getFontSize());
//处理的字符
contentStream.showText(textPosition.getUnicode());
contentStream.endText();
contentStream.close();
}
}
//添加提取的图片 如果使用集合存入则需要循环处理
if (Objects.nonNull(pdImageXObject)) {
PDPageContentStream contents = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true);
contents.drawImage(pdImageXObject, "X坐标", "Y坐标", "图片宽", "图片高");
contents.close();
}
}
document.save("处理后的PDF存储位置");
}