我正在从PDF文档中提取文本。 此PDF是使用从AS400读取数据的WS生成的。因此,在打印文本时,输出如下:
orem ipsum dolor sit amet, **«VS123»** In eros risus, «VS124» sed felis quis, commodo interdum tellus. Donec vitae massa
“VS123”,“VS124”是来自AS400的变量.Java APi无法从变量读取值及其打印变量名而不是变量值。
我正在使用PDFBox https://pdfbox.apache.org/来提取文字。 代码源如下:
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDField;
import org.apache.pdfbox.pdmodel.interactive.form.PDNonTerminalField;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.PDFTextStripperByArea;
public class App
{
public static void main( String[] args ) throws IOException
{
try (PDDocument document = PDDocument.load(new File("C:/my.pdf"))) {
document.getClass();
if (!document.isEncrypted()) {
PDFTextStripperByArea stripper = new PDFTextStripperByArea();
stripper.setSortByPosition(true);
PDFTextStripper tStripper = new PDFTextStripper();
String pdfFileInText = tStripper.getText(document);
// split by whitespace
String lines[] = pdfFileInText.split("\\r?\\n");
for (String line : lines) {
System.out.println(line);
}
document.close();
}
}
}
}
输出以这堆错误开始:
AVERTISSEMENT:字体ArialMT nov中的ToUnicode CMap无效。 2017年6月16日 8:08:24 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode AVERTISSEMENT:字体ArialMT nov中没有CID + 77(77)的Unicode映射。 16,2017 8:08:24 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode AVERTISSEMENT:字体中没有CID + 111(111)的Unicode映射 ArialMT nov。 16,2017 8:08:24 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode AVERTISSEMENT:No 字体ArialMT nov中CID + 110(110)的Unicode映射。 2017年6月16日 8:08:24 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode AVERTISSEMENT:字体ArialMT中没有CID + 116(116)的Unicode映射 十一月16,2017 8:08:24 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode AVERTISSEMENT:字体中没有CID + 97(97)的Unicode映射 ArialMT nov。 16,2017 8:08:24 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode AVERTISSEMENT:No 字体ArialMT
中CID + 32(32)的Unicode映射
我还想用iText提取文字:
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
import java.io.IOException;
public class App {
private static final String FILE_NAME = "C:/my.pdf";
public static void main(String[] args) {
PdfReader reader;
try {
reader = new PdfReader(FILE_NAME);
String textFromPage = PdfTextExtractor.getTextFromPage(reader, 1);
System.out.println(textFromPage);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以下是PDF文档的一部分:
当Tryin提取文本或使用复制粘贴时,输出将为:
客户N°«VS35»«VS36» CONTRAT N°«VS28»
PDF文件的链接: https://drive.google.com/file/d/1RNea028nCReIVS8nRWNlBwUwBsDOhDYg/view?usp=sharing
答案 0 :(得分:2)
变量在PDF中呈现为白色,如PDFDebugger所示(摘自第1页的第二个内容流):
BT
/F3 9 Tf
1 0 0 1 70.944 30.6 Tm
1 g
1 G
[ (\253) ] TJ
ET
BT
1 0 0 1 75.984 30.6 Tm
[ (VS1) -2 (1) -3 (3) ] TJ
ET
“1 g”在/ DeviceGray中最大,因此为白色。所以那部分推出了“«VS113”。
这些值在PDF中稍后出现...其中一个出现在XObject表单内容流的末尾(一系列PDF操作)“X2”:
BT
1.0 0.0 0.0 1.0 153.3 457.35144 Tm
0.0 3.57696 Td
0 Tr
/DeviceRGB cs
0.0 0.0 0.0 sc
/TCCZPJ+ArialMT 11.04 Tf
[ (\0003\0001\0008\000 \0009\0007\0008\000 \0000\0001\0002) ] TJ
0.0 -3.57696 Td
ET
“0.0 0.0 0.0 sc”表示黑色,下一行到下一行有318 978 012.由于读取/ ToUnicode流时出错,无法提取。该流应该将每个代码映射到unicode但是缺少。 (你可能会认为这在视觉上很明显,但事情并非总是如此)。
唯一奇怪的是Adobe Reader获得了价值。
通过查看PDF的组件,似乎在第一步中生成PDF,这些“变量”在白色上打印为白色。在第二步中,第二个软件找到这些变量并在其位置打印实际文本。
答案 1 :(得分:0)
AFAIK,PDF不包含文本中显示的可变数据。如果那里有任何变量,它们可能已经转换为由它自己的交互界面使用。 (例如SVG互动)。
因此,在生成PDF时,变量名称已转换为字符串,并且实际可变数据可能已重命名。