当前位置: 首页 > 知识库问答 >
问题:

从带有变量的生成PDF文档中提取文本

谭昕
2023-03-14

我正在从一个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无法从变量中读取值,无法打印变量名而不是变量值。

我用的是PDFBoxhttps://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();
            }
        }
    }
}

输出从以下错误堆栈开始:

避免:字体为ArialMT 2017年11月16日8:08:24的ToUnicode CMap无效。阿帕奇。pdfbox。pdmodel。字体。PDType0Font toUnicode AVERTISSEMENT:2017年11月16日8:08:24 PM org字体中的CID 77(77)没有Unicode映射。阿帕奇。pdfbox。pdmodel。字体。PDType0Font toUnicode AVERTISSEMENT:2017年11月16日8:08:24 PM org字体中的CID 111(111)没有Unicode映射。阿帕奇。pdfbox。pdmodel。字体。PDType0Font toUnicode AVERTISSEMENT:2017年11月16日8:08:24 PM org字体中没有CID 110(110)的Unicode映射。阿帕奇。pdfbox。pdmodel。字体。PDType0Font toUnicode AVERTISSEMENT:2017年11月16日8:08:24 PM org字体中的CID 116(116)没有Unicode映射。阿帕奇。pdfbox。pdmodel。字体。PDType0Font toUnicode AVERTISSEMENT:2017年11月16日8:08:24 PM org字体中的CID 97(97)没有Unicode映射。阿帕奇。pdfbox。pdmodel。字体。PDType0Font toUnicode AVERTISSEMENT:在字体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文档的一部分:

当尝试提取文本或使用复制粘贴时,输出如下:

客户号«VS35»VS36»合同号«VS28»

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

共有2个答案

宫坚
2023-03-14

另外,PDF不包含文本中显示的变量数据。如果有任何变量,它们可能已经转换为由它自己的交互性界面使用。(例如SVG交互性)。

因此,在生成PDF时,变量名被转换为字符串,实际的变量数据可能已被重命名。

麻茂材
2023-03-14

变量在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

"1g"是最大的 /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,这些“变量”印在白色上。在第二步中,第二个软件找到这些变量,并在它们所在的位置打印实际文本。

 类似资料:
  • 问题内容: 如何 使用PHP 从PDF文档中提取文本? (我不能使用其他工具,我没有root用户访问权限) 我发现一些函数可用于纯文本,但是它们不能很好地处理Unicode字符: http://www.hashbangcode.com/blog/zend-lucene-and-pdf-documents-part-2-pdf- data-extraction-437.html 问题答案: 下载 c

  • 我知道以前也有人问过类似的问题,但是这些问题已经过时了(有些问题可以追溯到2006年)。 我有一个. net 3.5应用程序(w/iTextSharp 5),我正在转换为. net核心(iText 7),它从联邦快递跟踪文档中提取签名,通过SOAP服务以字节[]数组发送。这段代码多年来一直运行良好,只是略有更新。从联邦快递返回的PDF文档中有几个图像,但签名块不是110x46图像(这是pdf文件中

  • 我使用了Swagger UI来显示我的REST Web服务,并将其托管在服务器上。 然而,这种招摇过市的服务只能在特定的服务器上访问。如果我想脱机工作,有人知道我如何使用Swagger UI创建静态PDF并使用它吗?此外,PDF很容易与无权访问服务器的人共享。 非常感谢!

  • 问题内容: 我正在使用iText生成一些PDF,这些pdf具有一些汉字(简体中文-GB2312),但是我无法使用这些字符生成pdf。 谁能告诉我我哪里错了? 我尝试使用各种形式的创作,但没有成功: 有人可以帮我吗? 添加问题,这是我当前的测试代码: 问题答案: 您的CLASSPATH中有iText jar,但是您忘记添加(正确的)itext-asian.jar。 请从此处下载额外的jar ZIP文

  • 问题内容: 这是示例xml文档: 我想提取文本而不指定元素,我该怎么做,因为我有10个这样的文档。我想要这样做是因为我的问题是用户正在输入一个我不知道的单词,必须在其各自文本部分的所有10个xml文档中进行搜索。为此,我应该在不知道元素的情况下知道文本的位置。所有这些文档都不同的另一件事。 请帮忙!! 问题答案: 您可以简单地去除所有标签: 但是,如果您只想在Linux中搜索文件中的某些文本,则可

  • 问题内容: 我正在尝试使用提取此 PDF文件中包含的文本。 我正在使用PyPDF2模块,并具有以下脚本: 运行代码时,得到以下输出,该输出与PDF文档中包含的输出不同: 如何提取PDF文档中的文本? 问题答案: 要从PDF提取文本,请使用以下代码