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

时间:2017-11-13 09:28:27

标签: java pdf pdfbox apache-tika

我正在从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文档的一部分:

enter image description here

当Tryin提取文本或使用复制粘贴时,输出将为:

客户N°«VS35»«VS36» CONTRAT N°«VS28»

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

2 个答案:

答案 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时,变量名称已转换为字符串,并且实际可变数据可能已重命名。