ایجاد یک عملیات تجاری 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