gpt4 book ai didi

java - 使用变量从生成的 PDF 文档中提取文本

转载 作者:行者123 更新时间:2023-12-02 02:29:59 24 4
gpt4 key购买 nike

我正在从 PDF 文档中提取文本。此 PDF 是使用 WS 读取来自 AS400 的数据生成的。因此,当打印文本时,输出如下:

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: Invalid ToUnicode CMap in font ArialMT nov. 16, 2017 8:08:24 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode AVERTISSEMENT: No Unicode mapping for CID+77 (77) in font ArialMT nov. 16, 2017 8:08:24 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode AVERTISSEMENT: No Unicode mapping for CID+111 (111) in font ArialMT nov. 16, 2017 8:08:24 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode AVERTISSEMENT: No Unicode mapping for CID+110 (110) in font ArialMT nov. 16, 2017 8:08:24 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode AVERTISSEMENT: No Unicode mapping for CID+116 (116) in font ArialMT nov. 16, 2017 8:08:24 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode AVERTISSEMENT: No Unicode mapping for CID+97 (97) in font ArialMT nov. 16, 2017 8:08:24 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode AVERTISSEMENT: No Unicode mapping for CID+32 (32) in font ArialMT

我还尝试使用 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 文档的一部分:

enter image description here

当尝试提取文本或使用复制粘贴时,输出将是这样的:

客户编号 «VS35» « VS36 »契约(Contract)编号 «VS28»

PDF 文件的链接: https://drive.google.com/file/d/1RNea028nCReIVS8nRWNlBwUwBsDOhDYg/view?usp=sharing

最佳答案

变量在 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,但缺少这一点。 (您可能认为这里在视觉上很明显,但事情并不总是如此)。

唯一奇怪的是 Adob​​e Reader 获取这些值。

从PDF的组成部分来看,似乎在第一步中,生成了一个PDF,其中这些“变量”被打印在白色上。在第二步中,第二个软件找到这些变量并在其位置打印实际文本。

关于java - 使用变量从生成的 PDF 文档中提取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47260929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com