Problem mit XPDF in GCC



  • Hallo,

    ich zerbreche mir schons seit ein paar Tagen den Kopf über ein C++ Problem, kenne C++ sehr wenig, bin mehr VB / VB.net.

    Es geling mit XPDF zu kompilieren (http://www.foolabs.com/xpdf/download.html), aber ich benötige eine Erweiterung die mir Path oder Bild Objekte mit einem Marker "Path"/"Bild" erlaubt, wenn ich den Text nach Html extrahiere.

    Lexer::getObj in Lexer.cc liest den Textstream aus (der vorher schon entschlüsselt und dekomprimiert wurde) und gibt ein Objekt nach dem Anderen aus.

    Gfx.cc fragt Objekt nach Objekt ab und führt die Opcodes aus (Positionier Cursor, zeiche Liene/Text ...).

    BT -> Begin Text
    1 0 0 -1 0.58355 25.75842 Tm -> Setze Textmatrix
    /F0 15 Tf -> Setze Schriftart und Grösse
    <002E0026002E00300033002A0022002D>Tj -> Textstring anzeigen (hex, unicode)
    ET -> End Text
    0 0.73906 m -> Cursor bewegen
    464.88193 0.73906 l -> Linie zeichnen zu

    Den Code habe ich mir angeschaut, und wollte Gfx.cc folgendermassen verändern:

    Gleich am Anfang von Gfx::Go 4 Objekte definieren (BT=Begin Text, Tf=Set Textfont, Tj=Write Text, ET=End Text):

    char BTchar[2];
      BTchar[0] = 'B';
      BTchar[1] = 'T';
      BTchar[2] = '\0';
      char *BTptr = &BTchar[0];
      Object BTobj;
      BTobj.initCmd(BTptr);
      Object BTargs[0];
      printf("BTobj ");
      BTobj.print(stdout);
      printf("-----------------------------------\n");
      execOp(&BTobj, BTargs, 0);
    
      char Tfchar[2];
      Tfchar[0] = 'T';
      Tfchar[1] = 'f';
      Tfchar[2] = '\0';
      char *Tfptr = &Tfchar[0];
      Object Tfobj;
      Tfobj.initCmd(Tfptr);
      Object Tfargs[1];
      Tfargs[0].initName((char*) 'F0\0');
      Tfargs[1].initInt(12);
      printf("Tfobj ");
      Tfobj.print(stdout);
      printf("-----------------------------------\n");
      execOp(&Tfobj, Tfargs, 2);
    
      char Tjchar[2];
      Tjchar[0] = 'T';
      Tjchar[1] = 'j';
      Tjchar[2] = '\0';
      char *Tjptr = &Tjchar[0];
      Object Tjobj;
      Tjobj.initCmd(Tjptr);
    //  Tjobj.initCmd((char) 'Tj\0');
      Object Tjargs[0];
      Tjargs[0].initString(new GString((char*) 'ABC'));
      printf("Tjobj ");
      Tjobj.print(stdout);
      printf("-----------------------------------\n");
      execOp(&Tjobj, Tjargs, 1);
    
      char ETchar[2];
      ETchar[0] = 'E';
      ETchar[1] = 'T';
      ETchar[2] = '\0';
      char *ETptr = &ETchar[0];
      Object ETobj;
      ETobj.initCmd(ETptr);
      Object ETargs[0];
      printf("ETobj ");
      ETobj.print(stdout);
      printf("-----------------------------------\n");
      execOp(&ETobj, BTargs, 0);
    

    Ein wenig drunter, vor der Zeile

    execOp(&obj, args, numArgs);
    

    wollte ich die "l" (kleines L) abfangen, und meine 4 Objekte ausgeben:

    if (strcmp("l", obj.getCmd()) == 0) {
    
      printf("BTobj ");
      BTobj.print(stdout);
      printf("-----------------------------------\n");
      execOp(&BTobj, BTargs, 0);
    
      printf("Tfobj ");
      Tfobj.print(stdout);
      printf("-----------------------------------\n");
      execOp(&Tfobj, Tfargs, 2);
    
      printf("Tjobj ");
      Tjobj.print(stdout);
      printf("-----------------------------------\n");
      execOp(&Tjobj, Tjargs, 1);
    
      printf("ETobj ");
      ETobj.print(stdout);
      printf("-----------------------------------\n");
      execOp(&ETobj, BTargs, 0);
    
    }
    

    Das Programm kompiliert korrekt, bei der Ausgabe geschieht folgendes:

    l 0 716.79
    BTobj BT-----------------------------------
    Tfobj 12-----------------------------------
    Error (484516): Unknown operator ''
    Tjobj Tj-----------------------------------
    ETobj ET-----------------------------------

    Er fängt also korrekt ab, Objekt BT scheint er ohne Probleme zu übergeben, nur bei Tf gibt er ein Fehler "Unknown operator ''" aus, Tf scheint er als 12 (???) in meinem Objekt zu speichern, solch einen Token gibt es ja nicht.

    Tj und ET übergibt er wieder ohne Fehler.

    Was mache ich falsch, vielen Dank für jede Hilfe!



  • BT ist kein "Objekt", es ist ein Operator (Begin Text). Tj darf nur zwischen
    BT und ET vorkommen (Tj = Textshow-Operator). Aus Deinem Quelltext werde ich aber
    nicht so ganz schlau ...



  • Hallo Scheppertreiber,

    ich definiere gleich am Anfang 4 Objekt, die ich dann der Reihe nach aufrufe, BT, Tf, Tj, ET. Immer wenn der Parser/Lexer auf ein "l" Token trifft, feuert er zuerst mein BT, Tf, Tj und ET Objekte/Operator/Token ab.


Anmelden zum Antworten