java使用pdfbox从pdf中删除不可见文本
当我试图从上面的pdf中提取文本时,我得到了一个混合文本,它在Evence viewer中是不可见的,同时也是可见的。此外,一些需要的文本缺少查看器中没有缺少的字符,例如,“猎鹰”中的“S”和许多缺少的“½”字符。我认为这是由于不可见文本的干扰,因为在查看器中突出显示pdf时,可以看到不可见文本与可见文本重叠
有没有办法删除不可见的文本?还是有其他解决办法
代码:
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
public class App {
public static String getPdfText(String pdfPath) throws IOException {
File file = new File(pdfPath);
PDDocument document = null;
PDFTextStripper textStripper = null;
String text = null;
try {
document = PDDocument.load(file);
textStripper = new PDFTextStripper();
textStripper.setEndPage(1);
text = textStripper.getText(document);
} catch (IOException e) {
throw new IOException("Could not load file and strip text.", e);
} finally {
try {
if (document != null)
document.close();
} catch (IOException e) {
System.out.println("Could not close document");
}
}
return text;
}
public static void main(String[] args) {
String filename = "RevTeaser09072016.pdf";
String text = null;
try {
text = getPdfText(filename);
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
System.out.println(text);
}
}
输出(粗体文本为所需文本):
145 143 159 144 160 141 157155 156154150 153149 152148 151147 142 158 500 146 Selections Number of Teams Amount Bet REVERSE tEaSER caRd mark box as shown denotes home team PRO FOOTBALL - THURSDAY, NOVEMBER 15, 2012 1 BILLS ★ NFL PM8:25 2 DOLPHINS7– ½ 6– ½ PRO FOOTBALL - SUNDAY, NOVEMBER 18, 2012 3 REDSKINS ★ PM1:00 4 EAGLES10– ½ 3– ½ 5 PACKERS PM1:00 6 LIONS ★10– ½ 3– ½ 7 FALCONS ★ PM1:00 8 CARDINALS17– ½ 3+ ½ 9 BUCCANEERS PM1:00 10 PANTHERS ★7– ½ 6– ½ 11 COWBOYS ★ PM1:00 12 BROWNS14– ½ + ½ 13 RAMS ★ PM1:00 14 JETS10– ½ 3– ½ 15 PATRIOTS ★ PM4:25 16 COLTS17– ½ 3+ ½ 17 TEXANS ★ PM1:00 18 JAGUARS23– ½ 9+ ½ 19 BENGALS PM1:00 20 CHIEFS ★10– ½ 3– ½ 21 SAINTS PM4:05 22 RAIDERS ★12– ½ 1– ½ 23 BRONCOS ★ PM4:25 24 CHARGERS14– ½ + ½ 25 RAVENS NBC PM8:30 26 STEELERS ★7– ½ 6– ½ PRO FOOTBALL - MONDAY, NOVEMBER 19, 2012 27 49ERS ★ ESPN PM8:40 28 BEARS10– ½ 3– ½ 1,000 145 143 159 144 160 141 157155 156154150 153149 152148 151147 142 158 500 146 Selections Number of Teams Amount Bet REVERSE tEaSER caRd mark box as hown denotes home team PRO FOOTBALL - THURSDAY, NOVEMBER 15, 2012 1 BILLS ★ NFL PM8:25 2 DOLPHINS7– ½ 6– ½ PRO FOOTBALL - SUNDAY, NOVEMBER 18, 2012 3 REDSKINS ★ PM1:00 4 EAGLES10– ½ 3– ½ 5 PACKERS PM1:00 6 LIONS ★10– ½ 3– ½ 7 FALCONS ★ PM1:00 8 CARDINALS17– ½ 3+ ½ 9 BUCCANEERS PM1:00 10 PANTHERS ★7– ½ 6– ½ 11 COWBOYS ★ PM1:00 12 BROWNS14– ½ + ½ 13 RAMS ★ PM1:00 14 JETS10– ½ 3– ½ 15 PATRIOTS ★ PM4:25 16 COLTS17– ½ 3+ ½ 17 TEXANS ★ PM1:00 18 JAGUARS23– ½ 9+ ½ 19 BENGALS PM1:00 20 CHIEFS ★10– ½ 3– ½ 21 SAINTS PM4:05 22 RAIDERS ★12– ½ 1– ½ 23 BRONCOS ★ PM4:25 24 CHARGERS14– ½ + ½ 25 RAVENS NBC PM8:30 26 STEEL RS ★7– ½ 6– ½ PRO FOOTBALL - MONDAY, NOVEMBER 19, 2012 27 49ERS ★ ESPN PM8:40 28 BEARS10– ½ 3– ½ 1,000 145 143 159 14 160 41 15715 156154150 153149 152148 51147 142 158 50 146 S lections Number of Teams Amount Bet ark box as sho n denotes home team PRO F OTBALL - THURSDAY, NOVEMBER 15, 2012 1 BILLS ★ NFL PM8:25 2 DOLPHINS7– ½ 6– ½ PRO F OTBALL - SUNDAY, NOVEMBER 18, 2012 3 REDSKINS ★ PM1:0 4 EAGLES10– ½ 3– ½ 5 PACKERS PM1:0 6 LIONS ★10– ½ 3– ½ 7 FALCONS ★ PM1:0 8 CARDINALS17– ½ 3+ ½ 9 BU CANEERS PM1:0 10 PANTHERS ★7– ½ 6– ½ 11 COWBOYS ★ PM1:0 12 BROWNS14– ½ + ½ 13 RAMS ★ PM1:0 14 JETS10– ½ 3– ½ 15 PATRIOTS ★ PM4:25 16 COLTS17– ½ 3+ ½ 17 TEXANS ★ PM1:0 18 JAGUARS23– ½ 9+ ½ 19 BENGALS PM1:0 20 CHIEFS ★10– ½ 3– ½ 21 SAINTS PM4:05 22 RAIDERS ★12– ½ 1– ½ 23 BRONCOS ★ PM4:25 24 CHARGERS14– ½ + ½ 25 RAVENS NBC PM8:30 26 STEELERS ★7– ½ 6– ½ PRO F OTBALL - MONDAY, NOVEMBER 19, 2012 27 49ERS ★ ESPN PM8:40 28 BEARS10– ½ 3– ½ 1,0 MARK BOX AS SHOWN DENOTES HOME TEAM PRO FOOTBALL - THURSDAY, SEPTEMBER 8, 2016 1 PANTHERS nbc - 10½ 8:30p 2 BRONCOS - 3½ PRO FOOTBALL - SUNDAY, SEPTEMBER 11, 2016 FALCON - 9 1:00p 4 BUCCANEERS - 4½ 5 VIKINGS - 9½ 1:00p 6 TITANS - 4½ 7 EAGLES - 10½ 1:00p 8 BROWNS - 3½ 9 BENGALS - 9½ 1:00p 10 JETS - 4½ 11 SAINTS - 7½ 1:00p 12 RAIDERS - 6½ 13 CHIEFS - 14½ 1:00p 14 CHARGERS + ½ 15 RAVENS - 10½ 1:00p 16 BILLS - 3½ 17 TEXANS - 14 1:00p 18 BEARS + ½ 19 PACKERS - 12 1:00p 20 JAGUARS - 1½ 21 SEAHAWKS - 17½ 4:05p 22 DOLPHINS + 3½ 23 COWBOYS - 7½ 4:25p 24 GIANTS - 6½ 25 COLTS - 10½ 4:25p 26 LIONS - 3½ 27 CARDINALS nbc - 14½ 8:30p 28 PATRIOTS + ½ PRO FOOTBALL - MONDAY, SEPTEMBER 12, 2016 29 STEELERS espn - 10½ 7:10p 30 REDSKINS - 3½ 31 RAMS espn - 9 10:20p 32 49ERS - 4½
# 1 楼答案
OP的示例PDF中的不可见文本主要是通过定义剪辑路径(在文本所在的边界之外)和填充路径(将文本隐藏在下面)来实现不可见的。因此,在文本提取过程中,我们必须考虑路径相关指令,而忽略了不可见文本。p>
不幸的是,为这些指令设计的回调没有在
PDFTextStripper
或其父类LegacyPDFStreamEngine
和PDFStreamEngine
中声明但是它们在另一个主要的
PDFStreamEngine
子类PDFGraphicsStreamEngine
中声明,并且在PageDrawer
中合理地实现因此,为了利用这一点,我们可以复制&;粘贴&;将
PageDrawer
实现改编成PDFTextStripper
的子类,例如:(PDFVisibleTextStripper)
请确保使用
PDFVisibleTextStripper
构造函数中的内部运算符类,而不是PageDrawer
使用的同名类。确保只需遵循代码下的链接即可这会将输出减少到
这会删除大部分不需要的数据
在this question的上下文中,显然
processTextPosition
和deleteCharsInPath
计算字符基线结尾的方式隐式假定为水平文本,而不进行页面旋转。但是,如果一个人放松了“可见性”的标准,那么当一个角色的基线开始可见时,他可以假设该角色是可见的。在这种情况下,人们不再需要计算出的Vector end
,代码也可以用于旋转页面在this question的上下文中,很明显,由于浮点计算错误,恰好位于剪辑路径边界上的glyph原点坐标可能会漂移到剪辑路径之外。切换到“胖点坐标检查”被证明是一个可以接受的解决办法