برنامه نویسی

ایجاد یک عملیات تجاری PEX

PEX یک ویژگی جدید InterSystems IRIS است که امکان گسترش IRIS را با ویژگی های موجود از جاوا یا دات نت فراهم می کند.

ایجاد قابلیت همکاری آداپتورهای ورودی و خروجی، خدمات تجاری (ادغام از خارجی به داخلی) و عملیات (ادغام داخلی به خارجی) امکان پذیر است.

برای ایجاد یک کامپوننت PEX لازم است .NET (InterSystems.EnsLib.PEX) را وارد کنید.) یا جاوا (com.intersystems.enslib.pex.) کلاس مناسب را بسته بندی و گسترش داده یا پیاده سازی می کند.

در این مقاله از سرویس OCR خود استفاده خواهم کرد. این یک عملیات تجاری PEX دارد، کد را ببینید:

public class OcrOperation extends BusinessOperation {

    // Connection to InterSystems IRIS
    private IRIS iris;

    @Override
    public void OnInit() throws Exception {
        iris = GatewayContext.getIRIS();
    }

    @Override
    public Object OnMessage(Object request) throws Exception {
        IRISObject req = (IRISObject) request;
        String filePath = req.getString("FileName");
        String ocrText = doOcr(filePath);
        IRISObject response = (IRISObject)(iris.classMethodObject("Ens.StringContainer","%New",ocrText));
        return response;
    }

    public String doOcr(String filePath) {

        File tempFile = new File(filePath);

        String ocrText = "";

        try {

            if (tempFile.toString().contains(".pdf")) {
                ocrText = extractTextFromPDF(tempFile);
            } else {
                ocrText = extractTextFromImage(tempFile);
            }

            return ocrText;

        } catch (IllegalStateException | IOException | TesseractException e) {
            return e.getMessage();
        }

    }

    private String extractTextFromPDF(File tempFile) throws IOException, TesseractException {

        String ocrText = "";

        // Load file into PDFBox class
        PDDocument document;
        document = PDDocument.load(tempFile);

        // Extract images from file
        PDFRenderer pdfRenderer = new PDFRenderer(document);
        StringBuilder out = new StringBuilder();

        ITesseract tesseract = new Tesseract();
        tesseract.setDatapath("/usr/share/tessdata/"); //directory to trained models 
        tesseract.setLanguage("por"); // choose your language/trained model

        for (int page = 0; page < document.getNumberOfPages(); page++) {
            BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);

            // Create a temp image file
            File temp = File.createTempFile("tempfile_" + page, ".png");
            ImageIO.write(bim, "png", temp);

            String result = tesseract.doOCR(temp);
            out.append(result);

            // Delete temp file
            Files.delete(temp.toPath());

            ocrText = out.toString();
        }

        return ocrText;

    }

    private String extractTextFromImage(File tempFile) throws TesseractException {

        ITesseract tesseract = new Tesseract();
        tesseract.setDatapath("/usr/share/tessdata/"); //directory to trained models
        tesseract.setLanguage("eng+por"); // choose your language/trained model

        return tesseract.doOCR(tempFile); //call tesseract function doOCR() 
                                          //passing the file to be processed with OCR technique

    }

    @Override
    public void OnTearDown() throws Exception {
        // TODO Auto-generated method stub

    }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای عملیات، OnInit را برای شروع اتصال جاوا با IRIS و در صورت لزوم سایر منابع جاوا و OnTearDown را برای انتشار منابع تخصیص داده شده اجرا می کنید. در نهایت باید OnMessage را با کد منبع خود در عملیات PEX پیاده سازی کنید، از جمله کدی که از چارچوب های جاوا برای پیاده سازی چیزی استفاده می کند، در مورد من منطقی برای استخراج متن از تصاویر با استفاده از چارچوب Tess4J. این چارچوب از Google Tesseract برای OCR استفاده می کند.

برای اینکه اتصال جاوا کار کند، لازم است یک دروازه جاوا را در تولید با عملیات تجاری پیکربندی کنید تا اجازه ایجاد یک زمینه پروکسی جاوا را بدهد. نمونه تولید من را ببینید:

Class dc.ocr.OcrProduction Extends Ens.Production
{

XData ProductionDefinition
{
<Production Name="dc.ocr.OcrProduction" LogGeneralTraceEvents="false">
  <Description></Description>
  <ActorPoolSize>2</ActorPoolSize>
  <Item Name="OcrService" Category="" ClassName="dc.ocr.OcrService" PoolSize="1" Enabled="true" Foreground="false" Comment="" LogTraceEvents="false" Schedule=""> 
  </Item>
  <Item Name="JavaGateway" Category="" ClassName="EnsLib.JavaGateway.Service" PoolSize="1" Enabled="true" Foreground="false" Comment="" LogTraceEvents="false" Schedule="">
    <Setting Target="Host" Name="ClassPath">.:/usr/irissys/dev/java/lib/JDK18/*:/opt/irisapp/*:/usr/irissys/dev/java/lib/gson/*:/usr/irissys/dev/java/lib/jackson/*:/jgw/ocr-pex-1.0.0.jar</Setting> 
    <Setting Target="Host" Name="JavaHome">/usr/lib/jvm/java-8-openjdk-amd64/</Setting> 
  </Item> 
  <Item Name="OcrOperation" Category="" ClassName="EnsLib.PEX.BusinessOperation" PoolSize="1" Enabled="true" Foreground="false" Comment="" LogTraceEvents="false" Schedule=""> 
    <Setting Target="Host" Name="%gatewayPort">55555</Setting> 
    <Setting Target="Host" Name="%remoteClassname">community.intersystems.pex.ocr.OcrOperation</Setting> 
    <Setting Target="Host" Name="%gatewayExtraClasspaths">.:/usr/irissys/dev/java/lib/JDK18/*:/opt/irisapp/*:/usr/irissys/dev/java/lib/gson/*:/usr/irissys/dev/java/lib/jackson/*:/jgw/ocr-pex-1.0.0.jar</Setting> 
  </Item> 
</Production>
}

}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مهم است که مسیر کلاس را به Java JAR که توسط برنامه Java PEX شما استفاده می‌شود، پیکربندی کنید و پورت و نام کلاس Java PEX صحیح را تنظیم کنید.

تمام جزئیات را در github به سرویس OCR من مشاهده کنید. می توان از آن به عنوان نقطه شروع برنامه PEX استفاده کرد.

https://openexchange.intersystems.com/package/OCR-Service

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا