Java - извлекать текст из pdf из выделенной области в txt
Идея следующая,
Пользователь выбирает файл PDF, а затем этот файл преобразуется в изображение, и такое изображение отображается в приложении.
На изображении пользователь может выбрать позиции, которые хочет прочитать из файла pdf, и по окончании выбора позиции в фоновой программе считывает исходный файл pdf и текст, сохраненный в файле txt.
Важно, чтобы полученное изображение из 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());
}
}
}
Затем изображение отображается пользователю в приложении JavaFX в компонентах ImageView. Можете ли вы помочь мне получить точное положение мыши, когда мышь выбирает часть изображения, с которой вы хотите прочитать текст в файле 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.