2014-02-12 13 views
6

Von der tesseract v3.03 's release note unterstützt tesseract jetzt die Render-PDF-Ausgabe mit durchsuchbarem Text, aber ich weiß nicht, wie ich diese Funktion in meinem Code verwenden soll.
Derzeit verwende ich tess-two für meine Android-App, dann frage ich mich, kann diese Funktion für Android arbeiten?
tesseract v3.03 rendern PDF mit durchsuchbarem Textbeispiel

Es wäre toll, wenn Sie mir ein Beispiel geben können, die tesseract api verwendet pdf zu machen, und dann werde ich in dem Hafen von fehlenden Funktionen für tess-two Bibliothek versuchen.
Vielen Dank im Voraus.

P/s: Ich kann die pdfrenderer Datei sehen, die Ausgabe von pdf verarbeiten kann, aber ich weiß nicht, wie man es mit Basisapi anwendet.

aktualisieren: hier ist mein Versuch:

tesseract::TessResultRenderer* renderer = new tesseract::TessPDFRenderer(nat->api.GetDatapath()); 
__android_log_print(ANDROID_LOG_ERROR, "Test_tesseract", "data path = %s", nat->api.GetDatapath()); 
if (!nat->api.ProcessPages(c_file_name, NULL, 0, renderer)) { 
    __android_log_print(ANDROID_LOG_ERROR, "Test_tesseract", "process page failed"); 
    delete renderer; 
    return; 
} 

FILE* fout = fopen(c_pdf_file_name, "wb"); 
if (fout == NULL) { 
    __android_log_print(ANDROID_LOG_ERROR, "Test_tesseract", "Cannot create output file %s\n", c_pdf_file_name); 
    delete renderer; 
    return; 
} 

const char* data; 
int dataLength; 

bool boolValue = renderer->GetOutput(&data, &dataLength); 
if (boolValue) { 
    fwrite(data, 1, dataLength, fout); 
    if (fout != stdout) 
     fclose(fout); 
    else 
     clearerr(fout); 
}else{ 
    __android_log_print(ANDROID_LOG_ERROR, "Test_tesseract", "Cannot get output file"); 
} 

delete renderer; 

Mein Code bei ProcessPages Methode fehlgeschlagen ist. Nach dem Schreib log (Ich habe ein Problem mit Debugging in NDK), fand ich pdfrender BeginDocument immer false zurück in TessBaseAPI::ProcessPages Methode von baseapi.cpp:

if (renderer && !renderer->BeginDocument(kUnknownTitle)) { 
    success = false; 
} 

Habe ich etwas verpasst?

P/s: Ich benutze tess-two, die baseapi lieber capi

+0

Hallo @ R4j, hast du es geschafft, es funktioniert zu bekommen? – Bruce

+0

eigentlich, ich habe keine Zeit, um es zu beenden, und ich beende dieses Projekt vor – R4j

+0

Ich möchte dies fortsetzen, aber ich kann nicht finden, eine Möglichkeit zum Debuggen der nativen CPP-Code in Eclipse, welches Programm verwenden Sie debuggen? – Bruce

Antwort

1

Es ist wie folgt:

TessResultRenderer renderer = api.TessPDFRendererCreate(dataPath); 
api.TessBaseAPIProcessPages1(handle, image, null, 0, renderer); 
PointerByReference data = new PointerByReference(); 
IntByReference dataLength = new IntByReference(); 
api.TessResultRendererGetOutput(renderer, data, dataLength); 
byte[] bytes = data.getValue().getByteArray(0, dataLength); 
// then write bytes array to a file with PDF extension. 

Wenn Sie die Codes folgendes Problem haben, überprüfen Sie den Renderer Beispiel in this post aus.

+0

Ich aktualisierte meine Frage mit Code für Android implementieren, aber immer noch nicht funktionieren. Könnten Sie sich das ansehen? – R4j

+0

Es sieht korrekt aus. Es könnte etwas in "tess-two" Implementierung der neuen 'Renderer' API sein. – nguyenq

+0

tatsächlich, 'tess-two' verwenden ursprünglichen Tesseract Quellcode ohne zu modifizieren. Sie haben gerade einige Klassen hinzugefügt, um 'tesseract' api zu nennen. Ich möchte wissen ** Gibt es irgendwelche Bedingungen für das Rendern von PDF? **. Nach dem Lesen von 'pdfrenderer.cpp' fand ich, dass' pdf.ttf' und 'pdf.ttx' Dateien benötigt werden. Ich habe diese Dateien in den Tessdata-Ordner hinzugefügt, die BeginDocument-Methode kann jetzt funktionieren. Aber es gibt einige Probleme beim Lesen der Datei. Zum Beispiel, 'pix = pixRead (Seitenname);' immer 'NULL' zurückgeben – R4j