Java 按矩形获取图像

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"

我有这个方法,可以提取pdf中特定位置的文本

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图像的位置。下面是一个例子。这可以获得图像位置

  • 您需要创建一个类extends
    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的建议。

    请不要链接,只有答案;至少将示例中的关键代码复制到您的答案中。