Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用变量从生成的PDF文档中提取文本_Java_Pdf_Pdfbox_Apache Tika - Fatal编程技术网

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

Java 使用变量从生成的PDF文档中提取文本,java,pdf,pdfbox,apache-tika,Java,Pdf,Pdfbox,Apache Tika,我正在从PDF文档中提取文本。 此PDF是使用WS-reading从AS400读取数据生成的。因此,在打印文本时,输出如下: orem ipsum dolor sit amet, **«VS123»** In eros risus, «VS124» sed felis quis, commodo interdum tellus. Donec vitae massa import java.io.File; import java.io.IOException; import java.uti

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

orem ipsum dolor sit amet, **«VS123»**  In eros risus, «VS124» sed felis quis, commodo interdum tellus. Donec vitae massa
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();
            }
        }
    }
}
和«VS123»,«VS124»是AS400中的变量。Java APi无法从变量及其打印变量名(而不是变量值)中读取值

我正在使用PDFBox提取文本。 代码源如下所示:

orem ipsum dolor sit amet, **«VS123»**  In eros risus, «VS124» sed felis quis, commodo interdum tellus. Donec vitae massa
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();
            }
        }
    }
}
输出从以下错误堆栈开始:

避免:2017年11月16日字体中的ToUnicode CMap无效 晚上8:08:24 org.apache.pdfbox.pdmodel.font.PDType0Font-toUnicode 避免:字体为ArialMT nov的CID+77(77)没有Unicode映射。 2017年8月16日下午8:08:24 org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode避免:字体中的CID+111(111)没有Unicode映射 2017年11月16日上午8:08:24 org.apache.pdfbox.pdmodel.font.PDType0Font-toUnicode避免:否 2017年11月16日,字体为ArialMT的CID+110(110)的Unicode映射 晚上8:08:24 org.apache.pdfbox.pdmodel.font.PDType0Font-toUnicode 避免:字体为ArialMT的CID+116(116)没有Unicode映射 2017年11月16日晚上8:08:24 org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode避免:字体中的CID+97(97)没有Unicode映射 2017年11月16日上午8:08:24 org.apache.pdfbox.pdmodel.font.PDType0Font-toUnicode避免:否 字体为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文件的链接:

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


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

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


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

PDF中的变量呈现为白色,这可以从PDFDebugger中看出(摘自第1页的第二个内容流):

“1 g”为最大值,从/DeviceGray开始为白色。因此,该部分给出了“«VS113”

PDF中的值要晚得多。。。其中一个出现在XObject表单(一系列PDF操作)“X2”的内容流末尾:

“0.0.0 0 0.0 sc”表示黑色,下一行有318 978 012。由于读取/ToUnicode流时出错,无法提取此文件。该流应该将每个代码映射到unicode,但缺少unicode。(你可能认为这在视觉上是显而易见的,但事实并非总是如此)

唯一奇怪的是AdobeReader获得了这些值


从PDF的组件来看,似乎在第一步中,PDF是用这些“变量”以白色打印在白色上生成的。在第二步中,第二个软件会找到这些变量,并在它们所在的位置打印实际文本。

这些变量在PDF中呈现为白色,如PDFDebugger所示(摘自第1页的第二个内容流):

“1 g”为最大值,从/DeviceGray开始为白色。因此,该部分给出了“«VS113”

PDF中的值要晚得多。。。其中一个出现在XObject表单(一系列PDF操作)“X2”的内容流末尾:

“0.0.0 0 0.0 sc”表示黑色,下一行有318 978 012。由于读取/ToUnicode流时出错,无法提取此文件。该流应该将每个代码映射到unicode,但缺少unicode。(你可能认为这在视觉上是显而易见的,但事实并非总是如此)

唯一奇怪的是AdobeReader获得了这些值


从PDF的组件来看,似乎在第一步中,PDF是用这些“变量”以白色打印在白色上生成的。在第二个步骤中,第二个软件找到这些变量并在它们的位置打印实际文本。

问题不在ITXT上,标签移除的人添加了ITEXT标签,因为他们认为ITXT是最好的PDF库,而ITXT开发者是最好的PDF专家。尽管有这些知识,其中一些人不使用iText,因为他们不喜欢为他们编写的软件付钱给开发人员,或为他们的专业知识付钱给专家。他们可能不喜欢开发人员和专家。我猜AS 400代码不是内容流的一部分,而是作为注释添加的。这就解释了为什么在查看或打印文档时它们是可见的,但在提取页面内容时不存在。@AmedeeVanGasse我添加了itext标记,因为我也使用了itext来提取内容您的问题中的代码并不反映您对itext的使用情况。请共享该文件或与Adobe Reader一起查看该文件中是否有批注/注释。问题不是关于itext,标签删除的人添加了ItEXT标签,因为他们认为ITXT是最好的PDF库,而ITEXT开发者是最好的PDF专家。尽管有这些知识,其中一些人不使用iText,因为他们不喜欢为他们编写的软件付钱给开发人员,或为他们的专业知识付钱给专家。他们可能不喜欢开发人员和专家。我猜AS 400代码不是内容流的一部分,而是作为注释添加的。这就解释了为什么它们在查看或打印文档时可见,而在提取页面内容时却不存在。@AmedeeV