记一次使用pdfbox解析pdf,获取pdf的关键数据的工具使用
【摘要】 因为一个需求,需要获取pdf中的数据,对于从没有类似经验的我,还是显得未知,一切未知往往都不好评判工作量,于是说了需求后,我就立马去了解这个pdf解析工具,随着了解,知道了一些解析工具,最后的解析代码也就几行,很简单。比起之前的未知的压力,就轻松太多了。之后再有类似的pdf处理,也有类似的经验了。pdfbox当然还有其他的解析工具,如iTika,iText,pdfparser等,我就只介绍本...
因为一个需求,需要获取pdf中的数据,对于从没有类似经验的我,还是显得未知,一切未知往往都不好评判工作量,于是说了需求后,我就立马去了解这个pdf解析工具,随着了解,知道了一些解析工具,最后的解析代码也就几行,很简单。比起之前的未知的压力,就轻松太多了。之后再有类似的pdf处理,也有类似的经验了。
pdfbox
当然还有其他的解析工具,如iTika,iText,pdfparser等,我就只介绍本次我使用了,其他的应该类似,请自行学习。
实际代码示例:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.UUID;
import javax.imageio.ImageIO;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.text.PDFTextStripper;
public class PdfTest {
public static void main(String[] args) {
String path = "D:\\temp\\temp\\test.pdf";
File file = new File(path);
// 尽可能使用try-with-resource代替try-catch-finally
try (PDDocument document = PDDocument.load(file)) {
int pageSize = document.getNumberOfPages();
// 一页一页读取
for (int i = 0; i < pageSize; i++) {
// 文本内容
PDFTextStripper stripper = new PDFTextStripper();
// 设置按顺序输出
stripper.setSortByPosition(true);
stripper.setStartPage(i + 1);
stripper.setEndPage(i + 1);
String text = stripper.getText(document);
System.out.println(text.trim());
System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-");
// 图片内容
PDPage page = document.getPage(i);
PDResources resources = page.getResources();
Iterable<COSName> cosNames = resources.getXObjectNames();
if (cosNames != null) {
Iterator<COSName> cosNamesIter = cosNames.iterator();
while (cosNamesIter.hasNext()) {
COSName cosName = cosNamesIter.next();
if (resources.isImageXObject(cosName)) {
PDImageXObject Ipdmage = (PDImageXObject) resources.getXObject(cosName);
BufferedImage image = Ipdmage.getImage();
try (FileOutputStream out = new FileOutputStream("D:\\temp\\temp\\" + UUID.randomUUID() + ".png")) {
ImageIO.write(image, "png", out);
} catch (IOException e) {
}
}
}
}
}
} catch (InvalidPasswordException e) {
} catch (IOException e) {
}
}
}
亲测可用,基本上不用改变代码,只需要把目标的文件放到目标位置,就可以试验。
PDDocument.load(file)也可以传入输入流的,这样处理就比较方便。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)