How-to: Einsatz des OCR-Webservices von webPDF 7

Minimum technical requirements

  • Java version: 7
  • webPDF version: 7
  • wsclient version: 1

In diesem Beispiel wird die Nutzung des OCR-Webservices von webPDF vorgestellt. Die OCR-Funktionen in webPDF basieren auf tesseract.  Standartmäßig werden die Sprachen Deutsch,  Englisch, Französisch, Spanisch und Italienisch unterstützt. Sprachen lassen sich im tesseract-Ordner hinzufügen (Näheres dazu in der Anleitung von webPDF). Nicht unterstützt werden momentan Sprachen mit einem „Multibyte Character Set“. Dies betrifft zum Beispiel Arabisch und fernöstliche Sprachen. Wie anzunehmen macht die Anwendung des OCR-Webservices vor allem bei Dokumenten Sinn, die Text enthalten, der allerdings nicht als Text eingebettet ist. Zum Extrahieren von normalem Text aus PDF-Dokumenten bietet webPDF eine einfache Möglichkeit im Toolbox-Webservice an.

Anlegen des Projektes und Generierung der nötigen Proxy Klassen

Legen Sie wie in diesem vorhergehenden Beitrag ein Java Projekt in IntelliJ mit den folgenden Optionen an.

Template Command Line App
Project name OCRExample
Project Location ..\OCRExample
Base package net.webpdf

Öffnen Sie in IntelliJ die Projektansicht. Öffnen Sie im „src“-Ordner, wie aus ersten Beitrag bekannt, die Eingabeaufforderung und generieren Sie mit den folgenden Befehlen die Proxy Klassen.

wsimport -Xnocompile -s . http://localhost:8080/webPDF/soap/ocr?wsdl       -extension

Legen Sie wie in den vorherigen Beispielen eine „Main“ Klasse mit einer „main“ Methode an.

Das Projekt ist angelegt und die Proxy Klassen generiert.

Nutzung des Webservices „OCR“

Wie im Beispiel der vorherigen Blogs wird der gesamte Code wieder in die „main“-Methode der „Main“-Klasse eingefügt.

1.001

Vorher legen Sie allerdings noch einen Ordner mit der Bezeichnung „content“ an,  in dem Sie die im Anhang zu findenden Beispieldateien „TIFFimgContent.tiff“ und „webPDFContent.pdf“  einfügen.

1.002

Anlegen des neuen Ordners „content“

1.003

Projekt mit dem befüllten Ordner „content“

Beginnen Sie nun mit dem Anlegen des Programm-Codes in der ‚main‘-Methode.

File pdfFile = new File("./content/webPDFContent.pdf");
File tiffFile = new File("./content/TIFFimgContent.tiff");

URL ocrUrl;

try {
    ocrUrl = new URL("https://localhost:8080/webPDF/soap/ocr?wsdl");
} catch (MalformedURLException ex) {
    System.err.println(ex.getMessage());
    return;
}

Am Anfang werden 2 File Objekte erstellt, die auf die Dateien im „content“-Ordner des Projektes verweisen. Danach wird, wie aus den vorherigen Blogs bekannt, die URL für die Generierung der Service Instanz erzeugt.

Operation ocrStrictTextOperation = new Operation();
ocrStrictTextOperation.setOcr(new OcrType());
ocrStrictTextOperation.getOcr().setLanguage(OcrLanguageType.DEU);
ocrStrictTextOperation.getOcr().setOutputFormat(OcrOutputType.TEXT);

Operation ocrTolerantTextOperation = new Operation();
ocrTolerantTextOperation.setOcr(new OcrType());
ocrTolerantTextOperation.getOcr().setLanguage(OcrLanguageType.DEU);
ocrTolerantTextOperation.getOcr().setOutputFormat(OcrOutputType.TEXT);
//Auch Dateien mit einer kleineren Auflösung als 200 dpi werden verarbeitet
ocrTolerantTextOperation.getOcr().setCheckResolution(false);

Operation ocrHocrOperation = new Operation();
ocrHocrOperation.setOcr(new OcrType());
ocrHocrOperation.getOcr().setLanguage(OcrLanguageType.DEU);
ocrHocrOperation.getOcr().setOutputFormat(OcrOutputType.HOCR);

Operation ocrPdfOperation = new Operation();
ocrPdfOperation.setOcr(new OcrType());
ocrPdfOperation.getOcr().setLanguage(OcrLanguageType.DEU);
ocrPdfOperation.getOcr().setOutputFormat(OcrOutputType.PDF);
ocrPdfOperation.getOcr().setCheckResolution(false);

Hier werden 4 verschiedene „Operation“ Instanzen erzeugt. Die Nutzung der Webservice spezifischen Operations wurden im letzten Blogbeitrag vorgestellt. Alle „Operation“-Instanzen haben als Sprache Deutsch angegeben(OcrLanguageType.DEU). 2 der Instanzen nutzen als Ausgabeformat Text(OcrOutputType.TEXT) , eine Instanz XHTML nach dem hOCR-Standard(OcrOutputType.HOCR) und eine Instanz PDF(OcrOutputType.PDF).  2 Instanzen ignorieren die Prüfung auf eine Auflösung des übergebenen Dokumentes von minimal 200 DPI (setCheckResolution(false)) und 2 führen sie aus(standartmäßig auf true). Die Parameter finden Sie auch in der webPDF Anleitung.

OCRService ocrService = new OCRService(ocrUrl);

OCR ocr = ocrService.getOCRPort();

StringBuilder pdfTextResult = new StringBuilder("Aus einem PDF extrahierter Text:\n");
StringBuilder imgTextResult = new StringBuilder("Aus einem tiff-Bild extrahierter Text:\n");

try {
    DataHandler ocrHandler = ocr.execute(ocrStrictTextOperation, new DataHandler(new FileDataSource(pdfFile)), null);
    Scanner textScanner = new Scanner(ocrHandler.getInputStream());
    while (textScanner.hasNextLine()) {
        pdfTextResult.append(textScanner.nextLine()).append("\n");
    }

    ocrHandler = ocr.execute(ocrTolerantTextOperation, null, tiffFile.toURI().toURL().toString());
    textScanner = new Scanner(ocrHandler.getInputStream());
    while (textScanner.hasNextLine()) {
        imgTextResult.append(textScanner.nextLine()).append("\n");
    }

    ocrHandler = ocr.execute(ocrHocrOperation, new DataHandler(new FileDataSource(pdfFile)), null);
    ocrHandler.writeTo(new FileOutputStream(new File("./hOCRResult.xhtml")));

    ocrHandler = ocr.execute(ocrPdfOperation, null, tiffFile.toURI().toURL().toString());
    ocrHandler.writeTo(new FileOutputStream(new File("./PDFResult.pdf")));
    
} catch (WebserviceException | IOException e) {
    System.err.println(e.getMessage());
    return;
}

System.out.println(pdfTextResult.toString());
System.out.println("-----------------------------------------\n");
System.out.println(imgTextResult.toString());

In diesem Teil des Codes werden  erst das Service und das Port/Endpoint Objekt generiert. Danach werden 4 Anfragen an den OCR-Webservice gesendet. Der Rückgabewert wird jeweils temporär als DataHandler Objekt in die Variable „ocrHandler“ geladen. Bei den ersten beiden Anfragen wird eine Textdatei in einem DataHandler zurückgeliefert. Der Inhalt wird jeweils sofort mit einem Scanner Objekt ausgelesen und an den passenden StringBuilder angehängt. Die 3. Anfrage liefert eine XHTML-Datei im hOCR Standard in einem DataHandler zurück und die 4. eine PDF-Datei. Diese werden umgehend im Projektverzeichnis gespeichert. Am Ende werden die aus der PDF und der TIFF-Datei extrahierten Texte ausgegeben.

1.004

Die generierten XHTML und PDF-Dateien

1.005

Ausgabe bei der Ausführung

1.006

hOCRResult.xhtml im Browser

Sie haben mit dem OCR-Webservice den Text(Der nicht als normaler Text eingebunden war) aus einer PDF und einer TIFF Datei extrahiert, eine PDF Datei aus der Textanalyse einer TIFF Datei generiert und eine XHTML-Datei nach dem hOCR Standard aus der Textanalyse einer PDF Datei generiert!

Herzlichen Glückwunsch!

Anhang:

Benötigte Importe für die Klasse:

import de.webpdf.schema._1_0.operation.OcrLanguageType;
import de.webpdf.schema._1_0.operation.OcrOutputType;
import de.webpdf.schema._1_0.operation.OcrType;
import de.webpdf.schema._1_0.operation.Operation;
import de.webpdf.schema._1_0.soap.ocr.OCR;
import de.webpdf.schema._1_0.soap.ocr.OCRService;
import de.webpdf.schema._1_0.soap.ocr.WebserviceException;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;