Java 在提取数据时维护Pdf的结构

Java 在提取数据时维护Pdf的结构,java,pdf,itext,Java,Pdf,Itext,我正在尝试使用iText库从PDF文档中提取数据。我能够提取PDF文档,但在解析时无法保持PDF文件的结构 我也尝试使用ApacheTika和pdfbox,但仍然无法维护文件的结构。到目前为止,我尝试的代码如下: import java.io.PrintWriter; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.parser.PdfReaderContentParser; import com.itex

我正在尝试使用iText库从PDF文档中提取数据。我能够提取PDF文档,但在解析时无法保持PDF文件的结构

我也尝试使用ApacheTika和pdfbox,但仍然无法维护文件的结构。到目前为止,我尝试的代码如下:

import java.io.PrintWriter;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy;
import com.itextpdf.text.pdf.parser.TextExtractionStrategy;

public class ExtractPageContent {

    public static final String source = "C:/Users/xyz/Test.pdf";

    public static final String dest = "C:/Users/xyz/Test.txt";

    public void parsePdf(String pdf, String txt) throws IOException {
        PdfReader reader = new PdfReader(pdf);
        PdfReaderContentParser parser = new PdfReaderContentParser(reader);
        PrintWriter out = new PrintWriter(new FileOutputStream(txt));
        TextExtractionStrategy strategy;
        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
            strategy = parser.processContent(i, new SimpleTextExtractionStrategy());
            out.println(strategy.getResultantText());
        }
        out.flush();
        out.close();
        reader.close();
    }
    public static void main(String[] args) throws IOException {
        new ExtractPageContent().parsePdf(source, dest);
    }
}
导入java.io.PrintWriter;
导入com.itextpdf.text.pdf.PdfReader;
导入com.itextpdf.text.pdf.parser.PdfReaderContentParser;
导入com.itextpdf.text.pdf.parser.simpletextractionstrategy;
导入com.itextpdf.text.pdf.parser.TextExtractionStrategy;
公共类内容{
公共静态最终字符串source=“C:/Users/xyz/Test.pdf”;
公共静态最终字符串dest=“C:/Users/xyz/Test.txt”;
公共void parsePdf(字符串pdf,字符串txt)引发IOException{
PdfReader reader=新PdfReader(pdf);
PdfReaderContentParser=新的PdfReaderContentParser(读取器);
PrintWriter out=新的PrintWriter(新文件输出流(txt));
文本抽取策略;

对于(int i=1;i试试这个..它对我很有效。你需要使用PDFBox api。它是从pdf文档中提取文本的最佳库

import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.PDFTextStripperByArea;

public void readText(){
try {
    PDDocument document = null;
    document = PDDocument.load(new File("test.pdf"));
    document.getClass();
    if (!document.isEncrypted()) {
        PDFTextStripperByArea stripper = new PDFTextStripperByArea();
        stripper.setSortByPosition(true);
        PDFTextStripper Tstripper = new PDFTextStripper();
        String st = Tstripper.getText(document);
        System.out.println("Text:" + st);
    }
} catch (Exception e) {
    e.printStackTrace();
}
}

试试这个。它对我有用。你需要使用PDFBOXAPI。它是从pdf文档中提取文本的最佳库

import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.PDFTextStripperByArea;

public void readText(){
try {
    PDDocument document = null;
    document = PDDocument.load(new File("test.pdf"));
    document.getClass();
    if (!document.isEncrypted()) {
        PDFTextStripperByArea stripper = new PDFTextStripperByArea();
        stripper.setSortByPosition(true);
        PDFTextStripper Tstripper = new PDFTextStripper();
        String st = Tstripper.getText(document);
        System.out.println("Text:" + st);
    }
} catch (Exception e) {
    e.printStackTrace();
}
}

保持PDF的结构是什么意思?当我使用pdfbox或itext时,请参考url i.stack.imgur.com/pn1GQ.png中附带的图像,它包含两列,以水平直线读取。必须先阅读左列,然后再阅读右列。切勿将更多信息放入注释中。请编辑您的问题。对于下一个ti,请编辑您的问题me:查看帮助中心,了解“好问题”应提供哪些信息。当我使用pdfbox或itext以水平直线读取,而它包含2列时,itext和pdfbox中的文本提取器都希望文本以阅读顺序绘制,无需排序(在iText:
simpletextractionstrategy
中,在PDFBox
PDFTextStripper.setortbyposition(false)
)中,或者他们将其排序为单列和水平(在iText:
locationtextractionstrategy
中,在PDFBox
PDFTextStripper.setortbyposition(true)
)。您可以尝试改进任一库中的代码,首先尝试识别列并进行相应提取。识别并不简单。维护PDF的结构意味着什么?当我使用pdfbox或itext以水平直线读取时,请参阅url i.stack.imgur.com/pn1GQ.png中附带的图像,其中包含2列。请先阅读左栏,再阅读右栏不要在评论中添加更多信息。请编辑您的问题。下一次,请查看帮助中心,了解“好问题”应提供哪些信息。当我使用pdfbox或itext以水平直线读取,而它包含两列时-itext和pdfbox中的文本提取器都希望文本以读取顺序绘制,无需排序(在itext中:
SimpleTextActionStrategy
,在pdfbox
PDFTextStripper中。SetOrtbyPosition(false)
),或将其按单列和水平排序(在iText:
LocationTextExtractionStrategy
中,在PDFBox
PDFTextStripper.setSortByPosition(true)
中)。您可以尝试改进任一库中的代码,以便首先尝试识别列并进行相应提取。识别并不简单。您的代码没有使用
PDFTextStripperByArea剥离器
,是吗?它以何种方式维护OP所需的文件结构?请参阅url W中附带的图像当我使用pdfbox或itext时,当它包含两列时,以水平直线读取。必须先读取左列,然后读取右列column@mkl…我已使用剥离器对象将sort by position属性设置为true…
stripper.setSortByPosition(true)
我使用了stripper对象将sort by position属性设置为true-但是由于您没有使用
stripper
而使用
Tstripper
进行提取,因此
stripper
的sort by position属性没有任何区别。因此,您不使用
stripper
进行任何操作。您的代码不使用
PDFTextStripperByArea剥离器
对于任何内容,是吗?它以何种方式维护OP要求的文件结构?当我使用pdfbox或itext时,请参考url中附加的图像,以直线水平线读取,而它包含两列。必须先读取左列,然后读取右列column@mkl…我使用了剥离器对象将按位置排序属性设置为true…
stripper.setSortByPosition(true)
我使用了stripper对象将sort by position属性设置为true-但是由于您没有使用
stripper
而使用
Tstripper
进行提取,因此
stripper
的sort by position属性没有任何区别。因此,您不会对任何事情使用
stripper