iText是我这些天来选择的PDF工具。
“可见”是一个艰难的问题。您可以使用com.itextpdf.text.pdf.parse包的类来解析所有可解析的文本...但是这些类不知道剪辑。您可以轻松地将解析器限制为页面大小。
// all text on the page, regardless of position
PdfTextExtractor.getTextFromPage(reader, pageNum);
您实际上需要采用TextExtractionStrategy(过滤策略)的覆盖。它很快就会变得有趣,但我认为你可以在这里“开箱即用”获得你想要的一切。
是的,通过相同的包类。图像侦听器不像文本侦听器那样得到很好的支持,但确实存在。
是的。链接是指向各种PDF页面的“注释”。找到它们很简单,只需循环浏览每个页面的“注释数组”并挑选出链接注释即可。
PdfDictionary pageDict = myReader.getPageN(1);
PdfArray annots = pageDict.getAsArray(PdfName.ANNOTS);
ArrayList<String> dests = new ArrayList<String>();
if (annots != null) {
for (int i = 0; i < annots.size(); ++i) {
PdfDictionary annotDict = annots.getAsDict(i);
PdfName subType = annotDict.getAsName(PdfName.SUBTYPE);
if (subType != null && PdfName.LINK.equals(subType)) {
PdfDictionary action = annotDict.getAsDict(PdfName.A);
if (action != null && PdfName.URI.equals(action.getAsName(PdfName.S)) {
dests.add(action.getAsString(PdfName.URI).toString());
} // else { its an internal link, meh }
}
}
}
您可以在此处找到 PDF 规范。
绝对。对于XFA(LiveCycle Designer)或较旧的“AcroForm”表单,iText可以找到所有字段及其值。
AcroFields fields = myReader.getAcroFields();
Set<String> fieldNames = fields.getFields().keySet();
for (String fldName : fieldNames) {
System.out.println( fldName + ": " + fields.getField( fldName ) );
}
多选列表不会得到那么好的处理。您将在冒号后为空文本字段和按钮获得一个空格。没有太多的信息...但这会让你开始。
非常琐碎。是的。
Map<String, String> info = myPdfReader.getInfo();
System.out.println( info );
除了基本的作者/标题/等之外,您还可以通过 访问一个相当复杂的 XML 架构。reader.getMetadata()
A 可以根据您希望的任何条件忽略文本。字体大小听起来是正确的,基于您的评论。TextRenderFilter