diff options
author | Arturo Espinosa <unammx@src.gnome.org> | 1999-04-17 02:59:58 (GMT) |
---|---|---|
committer | Arturo Espinosa <unammx@src.gnome.org> | 1999-04-17 02:59:58 (GMT) |
commit | d9f9a6449f377b4c933b75d57541b19c6d088994 (patch) | |
tree | 04f7f0c54447ef792fbf83bc5039174f4681b3bb /pdf/xpdf/TextOutputDev.h |
Initial revision
Diffstat (limited to 'pdf/xpdf/TextOutputDev.h')
-rw-r--r-- | pdf/xpdf/TextOutputDev.h | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/pdf/xpdf/TextOutputDev.h b/pdf/xpdf/TextOutputDev.h new file mode 100644 index 0000000..8c1cc77 --- /dev/null +++ b/pdf/xpdf/TextOutputDev.h @@ -0,0 +1,176 @@ +//======================================================================== +// +// TextOutputDev.h +// +// Copyright 1997 Derek B. Noonburg +// +//======================================================================== + +#ifndef TEXTOUTPUTDEV_H +#define TEXTOUTPUTDEV_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include <stdio.h> +#include "gtypes.h" +#include "OutputDev.h" + +class GfxState; +class GfxFont; +class GString; + +//------------------------------------------------------------------------ +// TextString +//------------------------------------------------------------------------ + +class TextString { +public: + + // Constructor. + TextString(GfxState *state, GBool hexCodes1); + + // Destructor. + ~TextString(); + + // Add a character to the string. + void addChar(GfxState *state, double x, double y, + double dx, double dy, + Guchar c, GBool useASCII7); + +private: + + double xMin, xMax; // bounding box x coordinates + double yMin, yMax; // bounding box y coordinates + int col; // starting column + GString *text; // the text + double *xRight; // right-hand x coord of each char + TextString *yxNext; // next string in y-major order + TextString *xyNext; // next string in x-major order + GBool hexCodes; // subsetted font with hex char codes + + friend class TextPage; +}; + +//------------------------------------------------------------------------ +// TextPage +//------------------------------------------------------------------------ + +class TextPage { +public: + + // Constructor. + TextPage(GBool useASCII71); + + // Destructor. + ~TextPage(); + + // Begin a new string. + void beginString(GfxState *state, GString *s, GBool hex1); + + // Add a character to the current string. + void addChar(GfxState *state, double x, double y, + double dx, double dy, Guchar c); + + // End the current string, sorting it into the list of strings. + void endString(); + + // Coalesce strings that look like parts of the same line. + void coalesce(); + + // Find a string. If <top> is true, starts looking at top of page; + // otherwise starts looking at <xMin>,<yMin>. If <bottom> is true, + // stops looking at bottom of page; otherwise stops looking at + // <xMax>,<yMax>. If found, sets the text bounding rectange and + // returns true; otherwise returns false. + GBool findText(char *s, GBool top, GBool bottom, + double *xMin, double *yMin, + double *xMax, double *yMax); + + // Get the text which is inside the specified rectangle. + GString *getText(double xMin, double yMin, + double xMax, double yMax); + + // Dump contents of page to a file. + void dump(FILE *f); + + // Clear the page. + void clear(); + +private: + + GBool useASCII7; // use 7-bit ASCII? + + TextString *curStr; // currently active string + + TextString *yxStrings; // strings in y-major order + TextString *xyStrings; // strings in x-major order +}; + +//------------------------------------------------------------------------ +// TextOutputDev +//------------------------------------------------------------------------ + +class TextOutputDev: public OutputDev { +public: + + // Open a text output file. If <fileName> is NULL, no file is written + // (this is useful, e.g., for searching text). If <useASCII7> is true, + // text is converted to 7-bit ASCII; otherwise, text is converted to + // 8-bit ISO Latin-1. + TextOutputDev(char *fileName, GBool useASCII7); + + // Destructor. + virtual ~TextOutputDev(); + + // Check if file was successfully created. + virtual GBool isOk() { return ok; } + + //---- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() { return gTrue; } + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() { return gTrue; } + + //----- initialization and control + + // Start a page. + virtual void startPage(int pageNum, GfxState *state); + + // End a page. + virtual void endPage(); + + //----- update text state + virtual void updateFont(GfxState *state); + + //----- text drawing + virtual void beginString(GfxState *state, GString *s); + virtual void endString(GfxState *state); + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, Guchar c); + + //----- special access + + // Find a string. If <top> is true, starts looking at top of page; + // otherwise starts looking at <xMin>,<yMin>. If <bottom> is true, + // stops looking at bottom of page; otherwise stops looking at + // <xMax>,<yMax>. If found, sets the text bounding rectange and + // returns true; otherwise returns false. + GBool findText(char *s, GBool top, GBool bottom, + double *xMin, double *yMin, + double *xMax, double *yMax); + +private: + + FILE *f; // text file + GBool needClose; // need to close the file? + TextPage *text; // text for the current page + GBool hexCodes; // subsetted font with hex char codes + GBool ok; // set up ok? +}; + +#endif |