1 //======================================================================== 2 // 3 // ABWOutputDev.h 4 // 5 // Copyright 2006-2007 Jauco Noordzij <jauco@jauco.nl> 6 // Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> 7 // 8 //======================================================================== 9 10 #ifndef ABWOUTPUTDEV_H 11 #define ABWOUTPUTDEV_H 12 13 #ifdef __GNUC__ 14 #pragma interface 15 #endif 16 17 #include <stdio.h> 18 #include "goo/gtypes.h" 19 #include "goo/GooList.h" 20 #include "GfxFont.h" 21 #include "OutputDev.h" 22 #include "Catalog.h" 23 #include "UnicodeMap.h" 24 #include "PDFDoc.h" 25 26 #include <libxml/parser.h> 27 #include <libxml/tree.h> 28 #include <libxml/xpath.h> 29 #include <libxml/xpathInternals.h> 30 31 #ifdef _WIN32 32 # define SLASH '\\' 33 #else 34 # define SLASH '/' 35 #endif 36 37 #define xoutRound(x) ((int)(x + 0.5)) 38 39 class GfxState; 40 class GooString; 41 42 //------------------------------------------------------------------------ 43 // ABWOutputDev 44 //------------------------------------------------------------------------ 45 46 class ABWOutputDev: public OutputDev { 47 public: 48 49 // Open a text output file. If <fileName> is NULL, no file is written 50 // (this is useful, e.g., for searching text). If <useASCII7> is true, 51 // text is converted to 7-bit ASCII; otherwise, text is converted to 52 // 8-bit ISO Latin-1. <useASCII7> should also be set for Japanese 53 // (EUC-JP) text. If <rawOrder> is true, the text is kept in content 54 // stream order. 55 ABWOutputDev(xmlDocPtr ext_doc); 56 57 // Destructor. 58 virtual ~ABWOutputDev(); 59 60 // Check if file was successfully created. isOk()61 virtual GBool isOk() { return gTrue; } 62 63 //---- get info about output device 64 65 // Does this device use upside-down coordinates? 66 // (Upside-down means (0,0) is the top left corner of the page.) upsideDown()67 virtual GBool upsideDown() { return gTrue; } 68 69 // Does this device use drawChar() or drawString()? useDrawChar()70 virtual GBool useDrawChar() { return gTrue; } 71 72 // Does this device use beginType3Char/endType3Char? Otherwise, 73 // text in Type 3 fonts will be drawn with drawChar/drawString. interpretType3Chars()74 virtual GBool interpretType3Chars() { return gFalse; } 75 76 // Does this device need non-text content? needNonText()77 virtual GBool needNonText() { return gFalse; } 78 79 //----- initialization and control 80 81 // Start a page. 82 virtual void startPage(int pageNum, GfxState *state); 83 84 // End a page. 85 virtual void endPage(); 86 87 //----- update text state 88 virtual void updateFont(GfxState *state); 89 90 //----- text drawing 91 //new feature DevType()92 virtual int DevType() {return 1234;} 93 getPageWidth()94 int getPageWidth() { return maxPageWidth; } getPageHeight()95 int getPageHeight() { return maxPageHeight; } 96 float getBiggestSeperator(xmlNodePtr N_set, unsigned int direction, float * C1, float * C2); 97 void recursiveXYC(xmlNodePtr nodeset); 98 void splitNodes(float splitValue, unsigned int direction, xmlNodePtr N_parent, double extravalue); 99 virtual void beginString(GfxState *state, GooString *s); 100 virtual void endString(GfxState *state); 101 virtual void drawChar(GfxState *state, double x, double y, 102 double dx, double dy, 103 double originX, double originY, 104 CharCode code, int nBytes, Unicode *u, int uLen); 105 void beginWord(GfxState *state, double x, double y); 106 void endWord(); 107 void beginTextBlock(GfxState *state, double x, double y); 108 void endTextBlock(); 109 void interpretXYTree(); 110 void ATP_recursive(xmlNodePtr N_cur); 111 void cleanUpNode(xmlNodePtr N_parent, bool aggregateInfo); 112 void transformPage(xmlNodePtr N_parent); 113 void generateParagraphs(); 114 void addAlignment(xmlNodePtr N_parent); 115 void setPDFDoc(PDFDoc *priv_pdfdoc); 116 void createABW(); 117 118 private: 119 int maxPageWidth; 120 int maxPageHeight; 121 int G_pageNum; 122 int Style, maxStyle; 123 //A lot of values are nice to have around. I think that declaring some 124 //global variables that contain these values is faster & easier than reading 125 //them from the xml tree every time. 126 double height; 127 double wordSpace, charSpace; 128 double X1,X2,Y1,Y2,horDist, verDist, curDx, curDy; 129 bool mightBreak; 130 xmlDocPtr doc; 131 /* node pointers */ 132 xmlNodePtr N_root, N_content, N_page, N_style, N_text, N_styleset, N_Block, N_word, N_column, N_colset; 133 xmlNodePtr outputDoc; 134 xmlXPathContextPtr xpathCtx; 135 static const unsigned int HORIZONTAL = 0; 136 static const unsigned int VERTICAL = 1; 137 UnicodeMap *uMap; 138 PDFDoc *pdfdoc; 139 int xmlLsCountNode(xmlNodePtr node); 140 }; 141 #endif 142