Java 按矩形获取图像
我有这个方法,可以提取pdf中特定位置的文本Java 按矩形获取图像,java,image,pdf,pdfbox,Java,Image,Pdf,Pdfbox,我有这个方法,可以提取pdf中特定位置的文本 public static void getTextByRectangle(PDDocument doc,Rectangle rect) throws IOException{ PDFTextStripperByArea stripper = new PDFTextStripperByArea(); stripper.setSortByPosition( true ); stripper.addRegion( "class1"
public static void getTextByRectangle(PDDocument doc,Rectangle rect) throws IOException{
PDFTextStripperByArea stripper = new PDFTextStripperByArea();
stripper.setSortByPosition( true );
stripper.addRegion( "class1", rect );
PDPage firstPage = doc.getPage(0);
stripper.extractRegions( firstPage );
System.out.println( "Text in the area:" + rect );
System.out.println( stripper.getTextForRegion( "class1" ) );
}
除了提取图像,是否可以执行相同的操作???是的,您可以提取所有图像,并比较rect和图像的位置。下面是一个例子。这可以获得图像位置
PDFStreamEngine
。像这样,
公共类PrintImageLocations扩展了PDFStreamEngine
processOperator
。从ctmNew,您可以获得图像位置,然后将图像与您的rect进行比较,您将获得正确的图像
@Override
protected void processOperator(Operator operator, List<COSBase> operands) throws IOException {
String operation = operator.getName();
if ("Do".equals(operation)) {
COSName objectName = (COSName) operands.get(0);
PDXObject xobject = getResources().getXObject(objectName);
if (xobject instanceof PDImageXObject) {
PDImageXObject image = (PDImageXObject) xobject;
Matrix ctmNew = getGraphicsState().getCurrentTransformationMatrix();
float imageXScale = ctmNew.getScalingFactorX();
float imageYScale = ctmNew.getScalingFactorY();
// position in user space units. 1 unit = 1/72 inch at 72 dpi
System.out.println("position in PDF = " + ctmNew.getTranslateX() + ", " + ctmNew.getTranslateY() + " in user space units");
// displayed size in user space units
System.out.println("displayed size = " + imageXScale + ", " + imageYScale + " in user space units");
} else if (xobject instanceof PDFormXObject) {
PDFormXObject form = (PDFormXObject) xobject;
showForm(form);
}
} else {
super.processOperator(operator, operands);
}
}
@覆盖
受保护的void processOperator(运算符运算符、列表操作数)引发IOException{
字符串操作=operator.getName();
if(“Do.”等于(操作)){
COSName objectName=(COSName)操作数。get(0);
PDXObject xobject=getResources().getXObject(objectName);
if(PDImageXObject的xobject实例){
PDImageXObject image=(PDImageXObject)xobject;
矩阵ctmNew=getGraphicsState().getCurrentTransformationMatrix();
float imageXScale=ctmNew.getScalingFactorX();
float imageYScale=ctmNew.getScalingFactorY();
//以用户空间单位表示的位置。72 dpi时,1个单位=1/72英寸
System.out.println(“PDF中的位置=“+ctmNew.getTranslate()+”,“+ctmNew.getTranslateY()+”,以用户空间单位表示”);
//以用户空间单位显示的大小
System.out.println(“显示大小=“+imageXScale+”,“+imageYScale+”,以用户空间单位表示”);
}else if(PDFormXObject的xobject实例){
PDFormXObject form=(PDFormXObject)xobject;
展示形式(表格);
}
}否则{
超级处理运算符(运算符、操作数);
}
}
感谢mkl和FiReTiTi的建议。请不要链接,只有答案;至少将示例中的关键代码复制到您的答案中。