⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 textoutputdev.h

📁 source code: Covert TXT to PDF
💻 H
字号:
//========================================================================//// TextOutputDev.h//// Copyright 1997-2002 Glyph & Cog, LLC////========================================================================#ifndef TEXTOUTPUTDEV_H#define TEXTOUTPUTDEV_H#include <aconf.h>#ifdef USE_GCC_PRAGMAS#pragma interface#endif#include <stdio.h>#include "gtypes.h"#include "GfxFont.h"#include "OutputDev.h"class GString;class GList;class GfxFont;class GfxState;//------------------------------------------------------------------------typedef void (*TextOutputFunc)(void *stream, char *text, int len);//------------------------------------------------------------------------// TextFontInfo//------------------------------------------------------------------------class TextFontInfo {public:  TextFontInfo(GfxState *state);  ~TextFontInfo();  GBool matches(GfxState *state);private:  GfxFont *gfxFont;  double horizScaling;  double minSpaceWidth;		// min width for inter-word space, as a				//   fraction of the font size  double maxSpaceWidth;		// max width for inter-word space, as a				//   fraction of the font size  friend class TextWord;  friend class TextPage;};//------------------------------------------------------------------------// TextWord//------------------------------------------------------------------------class TextWord {public:  // Constructor.  TextWord(GfxState *state, double x0, double y0,	   TextFontInfo *fontA, double fontSize);  // Destructor.  ~TextWord();  // Add a character to the word.  void addChar(GfxState *state, double x, double y,	       double dx, double dy, Unicode u);private:  GBool xyBefore(TextWord *word2);  void merge(TextWord *word2);  double xMin, xMax;		// bounding box x coordinates  double yMin, yMax;		// bounding box y coordinates  double yBase;			// baseline y coordinate  Unicode *text;		// the text  double *xRight;		// right-hand x coord of each char  int len;			// length of text and xRight  int size;			// size of text and xRight arrays  TextFontInfo *font;		// font information  double fontSize;		// font size  GBool spaceAfter;		// set if there is a space between this				//   word and the next word on the line  TextWord *next;		// next word in line (before lines are				//   assembled: next word in xy order)  friend class TextLine;  friend class TextPage;};//------------------------------------------------------------------------// TextLine//------------------------------------------------------------------------class TextLine {public:  TextLine();  ~TextLine();private:  GBool yxBefore(TextLine *line2);  void merge(TextLine *line2);  double xMin, xMax;		// bounding box x coordinates  double yMin, yMax;		// bounding box y coordinates  double yBase;			// primary baseline y coordinate  double xSpaceL, xSpaceR;	// whitespace to left and right of this line  TextFontInfo *font;		// primary font  double fontSize;		// primary font size  TextWord *words;		// words in this line  Unicode *text;		// Unicode text of the line, including				//   spaces between words  double *xRight;		// right-hand x coord of each Unicode char  int *col;			// starting column number of each Unicode char  int len;			// number of Unicode chars  int convertedLen;		// total number of converted characters  GBool hyphenated;		// set if last char is a hyphen  TextLine *pageNext;		// next line on page  TextLine *next;		// next line in block  TextLine *flowNext;		// next line in flow  friend class TextBlock;  friend class TextPage;};//------------------------------------------------------------------------// TextBlock//------------------------------------------------------------------------class TextBlock {public:  TextBlock();  ~TextBlock();private:  GBool yxBefore(TextBlock *blk2);  void mergeRight(TextBlock *blk2);  void mergeBelow(TextBlock *blk2);  double xMin, xMax;		// bounding box x coordinates  double yMin, yMax;		// bounding box y coordinates  double xSpaceL, xSpaceR;	// whitespace to left and right of this block  double ySpaceT, ySpaceB;	// whitespace above and below this block  double maxFontSize;		// max primary font size  TextLine *lines;		// lines in block  TextBlock *next;		// next block in flow  TextBlock *stackNext;		// next block on traversal stack  friend class TextFlow;  friend class TextPage;};//------------------------------------------------------------------------// TextFlow//------------------------------------------------------------------------class TextFlow {public:  TextFlow();  ~TextFlow();private:  double yMin, yMax;		// bounding box y coordinates  double ySpaceT, ySpaceB;	// whitespace above and below this flow  TextBlock *blocks;		// blocks in flow  TextLine *lines;		// lines in flow  TextFlow *next;		// next flow on page  friend class TextPage;};//------------------------------------------------------------------------// TextPage//------------------------------------------------------------------------class TextPage {public:  // Constructor.  TextPage(GBool rawOrder);  // Destructor.  ~TextPage();  // Update the current font.  void updateFont(GfxState *state);  // Begin a new word.  void beginWord(GfxState *state, double x0, double y0);  // Add a character to the current word.  void addChar(GfxState *state, double x, double y,	       double dx, double dy,	       CharCode c, Unicode *u, int uLen);  // End the current word, sorting it into the list of words.  void endWord();  // Add a word, sorting it into the list of words.  void addWord(TextWord *word);  // 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(Unicode *s, int len,		 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(void *outputStream, TextOutputFunc outputFunc,	    GBool physLayout);  // Start a new page.  void startPage(GfxState *state);private:  void clear();  double lineFit(TextLine *line, TextWord *lastWord, TextWord *word);  GBool lineFit2(TextLine *line0, TextLine *line1);  GBool blockFit(TextBlock *blk, TextLine *line);  GBool blockFit2(TextBlock *blk0, TextBlock *blk1);  GBool flowFit(TextFlow *flow, TextBlock *blk);  GBool rawOrder;		// keep text in content stream order  double pageWidth, pageHeight;	// width and height of current page  TextWord *curWord;		// currently active string  TextFontInfo *font;		// current font  double fontSize;		// current font size  int nest;			// current nesting level (for Type 3 fonts)  int nTinyChars;		// number of "tiny" chars seen so far  TextWord *words;		// words, in xy order (before they're				//   sorted into lines)  TextWord *wordPtr;		// cursor for the word list  TextLine *lines;		// lines, in xy order  TextFlow *flows;		// flows, in reading order  GList *fonts;			// all font info objects used on this				//   page [TextFontInfo]};//------------------------------------------------------------------------// 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  // <physLayoutA> is true, the original physical layout of the text  // is maintained.  If <rawOrder> is true, the text is kept in  // content stream order.  TextOutputDev(char *fileName, GBool physLayoutA,		GBool rawOrderA, GBool append);  // Create a TextOutputDev which will write to a generic stream.  If  // <physLayoutA> is true, the original physical layout of the text  // is maintained.  If <rawOrder> is true, the text is kept in  // content stream order.  TextOutputDev(TextOutputFunc func, void *stream,		GBool physLayoutA, GBool rawOrderA);  // 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; }  // 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  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,			double originX, double originY,			CharCode c, Unicode *u, int uLen);  //----- path painting  //----- 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(Unicode *s, int len,		 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);private:  TextOutputFunc outputFunc;	// output function  void *outputStream;		// output stream  GBool needClose;		// need to close the output file?				//   (only if outputStream is a FILE*)  TextPage *text;		// text for the current page  GBool physLayout;		// maintain original physical layout when				//   dumping text  GBool rawOrder;		// keep text in content stream order  GBool ok;			// set up ok?};#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -