Convert InputStream zur Datei
Habe ich einen REST-webservice gebaut mit Jersey das bedeutet OCR (Optical Character Recognition) verwenden von Tesseract über die Tess4J Java-Bindung. Jetzt die Tess4J Bibliothek erwartet, dass Sie senden Sie ein Bild-Datei (png, jpg, tif u.a.), aber mit Jersey-Verarbeitung bekomme ich einen InputStream, dass enthält das Bild.
Wie konvertiere ich diese InputStream auf eine Datei-Typ, der Tesseract erkennen wäre? Ich habe versucht, die folgenden:
import org.apache.commons.io.IOUtils;
.....
private static File stream2file (InputStream in) throws IOException {
final File tempFile = File.createTempFile("stream2file", ".tmp");
tempFile.deleteOnExit();
try (FileOutputStream out = new FileOutputStream(tempFile)) {
IOUtils.copy(in, out);
}
return tempFile;
}
Aber dann Tesseract-Bibliothek eine Ausnahme wirft, sagen, dass es nicht die Datei annehmen Art ich werde senden (Was jetzt in diesem Fall ist 'tmp'). Ich habe versucht, die änderung, die wenig 'tmp' in 'tif' und anderen unterstützten Dateitypen aber, dass nur ergab die gleichen Ergebnisse, also bin ich offensichtlich hier etwas fehlt.
So, wie kann ich einen InputStream, konvertieren Sie es, und schicken es zu Tesseract als einer der unterstützten Datei-Typen, die er erwartet?
- Wie bekommt man den InputStream von der WebService-Aufruf? Haben Sie schon einmal versucht, öffnen Sie den temp-Datei mit einem anderen Bildbearbeitungsprogramm wie
Image Magick
? Hat Ihr Bild-Datei (tmp-Datei) haben die erwartete Größe? ... btw. Java 7java.nio.file.Files
unterstützt das kopierenInputStreams
Pfade. - Ich bekomme das Bild über ein Formular ('multipart/form-data') mit der POST. Nichts falsch mit dem Bild, obwohl, arbeitet perfekt in meiner console app, die verwendet Tess4J. Ich habe nicht versucht, Image Magick Nein, ich nur könnte.
- Und die Temp-Datei hat die gleiche Größe und Inhalt wie die ursprüngliche Datei? Tut tesseract aufgerufen, die von der Eingabeaufforderung akzeptieren Sie die temp-Datei
- Übrigens
.deleteOnExit();
nicht tatsächlich löschen Sie die temp-Datei an, bis die JVM heruntergefahren erfolgreich (und nur, wenn Sie heruntergefahren erfolgreich). Sie sollten erwägen, ein etwas wietry { ... } finally { tempFile.delete(); }
. Lesen Sie mehr von Oracle aufdeleteOnExit
hier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Dateiendung der temp-Datei muss mit dem original übereinstimmen-input-image-Datei.
Neben
File
geben, Tess4J auch akzeptiertBufferedImage
als Eingabe. Nur convert inputstream, um es, wie folgt:versuchen
(FileOutputStream out = new FileOutputStream(tempFile))
. Sie haben einen Fehler auf dieser Linie.Sollten Sie verwenden
FileOutputStream (String)
nichtFileOutputStream(File)
.So sollte es sein
FileOutputStream(tempfile.getName())
.Den parameter, den Sie übergeben die an den constructor von
FileOutputStream
ist ein string, der den Pfad zur echten Datei oder der name der Datei. Es ist nicht eineFile
Objekt.