//======================================================================== // // ABWOutputDev.h // // Copyright 2006 Jauco Noordzij // //======================================================================== #ifndef ABWOUTPUTDEV_H #define ABWOUTPUTDEV_H #ifdef __GNUC__ #pragma interface #endif #include #include "goo/gtypes.h" #include "goo/GooList.h" #include "GfxFont.h" #include "OutputDev.h" #include "Catalog.h" #include "UnicodeMap.h" #include "PDFDoc.h" #include #include #include #include #ifdef WIN32 # define SLASH '\\' #else # define SLASH '/' #endif #define xoutRound(x) ((int)(x + 0.5)) class GfxState; class GooString; //------------------------------------------------------------------------ // ABWOutputDev //------------------------------------------------------------------------ class ABWOutputDev: public OutputDev { public: // Open a text output file. If is NULL, no file is written // (this is useful, e.g., for searching text). If is true, // text is converted to 7-bit ASCII; otherwise, text is converted to // 8-bit ISO Latin-1. should also be set for Japanese // (EUC-JP) text. If is true, the text is kept in content // stream order. ABWOutputDev(xmlDocPtr ext_doc); // Destructor. virtual ~ABWOutputDev(); // Check if file was successfully created. virtual GBool isOk() { return gTrue; } //---- 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; } // Does this device use beginType3Char/endType3Char? Otherwise, // text in Type 3 fonts will be drawn with drawChar/drawString. virtual GBool interpretType3Chars() { return gFalse; } // Does this device need non-text content? virtual GBool needNonText() { return gFalse; } //----- 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 //new feature virtual int DevType() {return 1234;} int getPageWidth() { return maxPageWidth; } int getPageHeight() { return maxPageHeight; } float getBiggestSeperator(xmlNodePtr N_set, unsigned int direction, float * C1, float * C2); void recursiveXYC(xmlNodePtr nodeset); void splitNodes(float splitValue, unsigned int direction, xmlNodePtr N_parent, double extravalue); virtual void beginString(GfxState *state, GooString *s); virtual void endString(GfxState *state); virtual void drawChar(GfxState *state, double x, double y, double dx, double dy, double originX, double originY, CharCode code, int nBytes, Unicode *u, int uLen); void beginWord(GfxState *state, double x, double y); void endWord(); void beginTextBlock(GfxState *state, double x, double y); void endTextBlock(); void interpretXYTree(); void ATP_recursive(xmlNodePtr N_cur); void cleanUpNode(xmlNodePtr N_parent, bool aggregateInfo); void transformPage(xmlNodePtr N_parent); void generateParagraphs(); void addAlignment(xmlNodePtr N_parent); void setPDFDoc(PDFDoc *priv_pdfdoc); void createABW(); private: int maxPageWidth; int maxPageHeight; int G_pageNum; int Style, maxStyle; //A lot of values are nice to have around. I think that declaring some //global variables that contain these values is faster & easier than reading //them from the xml tree every time. double height; double wordSpace, charSpace; double X1,X2,Y1,Y2,horDist, verDist, curDx, curDy; bool mightBreak; xmlDocPtr doc; /* node pointers */ xmlNodePtr N_root, N_content, N_page, N_style, N_text, N_styleset, N_Block, N_word, N_column, N_colset; xmlNodePtr outputDoc; xmlXPathContextPtr xpathCtx; static const unsigned int HORIZONTAL = 0; static const unsigned int VERTICAL = 1; UnicodeMap *uMap; PDFDoc *pdfdoc; int xmlLsCountNode(xmlNodePtr node); }; #endif