Java - 将pdf中的文本从选定区域提取到txt

时间:2016-10-13 16:09:50

标签: java javafx pdfbox pdfrenderer

接下来的想法是

用户选择一个pdf文件,然后将该文件转换为图像,并在应用程序中显示这样的图像。

在图像中,用户可以选择想要从pdf文件中读取的位置,以及后台程序中带有选择位置的完成时读取存储在txt文件中的原始pdf和文本。

重要的是,pdf文件的结果图像与他自己的pdf文件相同

下一个代码将pdf转换为图像。我使用pdfrenderer-0.9.1.jar

import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import javax.imageio.ImageIO;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;


public class Pdf2Image {

public static void main(String[] args) {

    File file = new File("E:\\invoice-template-1.pdf");
    RandomAccessFile raf;
    try {
        raf = new RandomAccessFile(file, "r");

        FileChannel channel = raf.getChannel();
        ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
        PDFFile pdffile = new PDFFile(buf);
        // draw the first page to an image
        int num=pdffile.getNumPages();
        for(int i=0;i<num;i++)
        {
            PDFPage page = pdffile.getPage(i);

            //get the width and height for the doc at the default zoom              
            int width=(int)page.getBBox().getWidth();
            int height=(int)page.getBBox().getHeight();             

            Rectangle rect = new Rectangle(0,0,width,height);
            int rotation=page.getRotation();
            Rectangle rect1=rect;
            if(rotation==90 || rotation==270)
                rect1=new Rectangle(0,0,rect.height,rect.width);

            //generate the image
            BufferedImage img = (BufferedImage)page.getImage(
                        rect.width, rect.height, //width & height
                        rect1, // clip rect
                        null, // null for the ImageObserver
                        true, // fill background with white
                        true  // block until drawing is done
                );

            ImageIO.write(img, "png", new File("E:/invoice-template-"+i+".png"));
        }
    } 
    catch (FileNotFoundException e1) {
        System.err.println(e1.getLocalizedMessage());
    } catch (IOException e) {
        System.err.println(e.getLocalizedMessage());
    }
}
}

然后在ImageView组件中的JavaFX应用程序中向用户显示图像。 当用户选择要从中读取pdf文件中文本的部分图像时,您能帮助我获得鼠标的准确位置吗?

使用此代码我读取pdf文件并从设置位置获取文本,只有我必须手动输入位置:(。我使用pdfbox-1.3.1.jar。 我想让客户选择在列表中保留一张图片,并从pdf文件中读取所有这些位置的文本。

    File file = new File("E:/invoice-template-1.pdf");
    PDDocument document = PDDocument.load(file);
    PDFTextStripperByArea stripper = new PDFTextStripperByArea();
    stripper.setSortByPosition(true);
    Rectangle rect1 = new Rectangle(38, 275, 15, 100);
    Rectangle rect2 = new Rectangle(54, 275, 40, 100); 
    stripper.addRegion("row1column1", rect1);
    stripper.addRegion("row1column2", rect2);
    List allPages = document.getDocumentCatalog().getAllPages();
    List<PDPage> pages = document.getDocumentCatalog().getAllPages();
    int j = 0;

    for (PDPage page : pages) {
        stripper.extractRegions(page);
        stripper.setSortByPosition(true);
        List<String> regions = stripper.getRegions();
        for (String region : regions) {
            String text = stripper.getTextForRegion(region);
            System.out.println("Region: " + region + " on Page " + j);
            System.out.println("\tText: \n" + text);
        }

例如,  在下一张发票中,我想选择4个位置来导出文本,当你选择图片时,保留在列表中的尺寸,然后浏览列表并从那些位置导出pdf文件中的文本。

enter image description here

0 个答案:

没有答案