File indexing completed on 2025-12-10 10:23:51
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #ifndef TEXTOUTPUTDEV_H
0037 #define TEXTOUTPUTDEV_H
0038
0039 #include "poppler-config.h"
0040 #include "poppler_private_export.h"
0041 #include <cstdio>
0042 #include "GfxFont.h"
0043 #include "GfxState.h"
0044 #include "OutputDev.h"
0045
0046 class GooString;
0047 class Gfx;
0048 class GfxFont;
0049 class GfxState;
0050 class UnicodeMap;
0051 class AnnotLink;
0052
0053 class TextWord;
0054 class TextPool;
0055 class TextLine;
0056 class TextLineFrag;
0057 class TextBlock;
0058 class TextFlow;
0059 class TextLink;
0060 class TextUnderline;
0061 class TextWordList;
0062 class TextPage;
0063 class TextSelectionVisitor;
0064
0065
0066
0067 typedef void (*TextOutputFunc)(void *stream, const char *text, int len);
0068
0069 enum SelectionStyle
0070 {
0071 selectionStyleGlyph,
0072 selectionStyleWord,
0073 selectionStyleLine
0074 };
0075
0076 enum EndOfLineKind
0077 {
0078 eolUnix,
0079 eolDOS,
0080 eolMac
0081 };
0082
0083
0084
0085
0086
0087 class POPPLER_PRIVATE_EXPORT TextFontInfo
0088 {
0089 public:
0090 explicit TextFontInfo(const GfxState *state);
0091 ~TextFontInfo();
0092
0093 TextFontInfo(const TextFontInfo &) = delete;
0094 TextFontInfo &operator=(const TextFontInfo &) = delete;
0095
0096 bool matches(const GfxState *state) const;
0097 bool matches(const TextFontInfo *fontInfo) const;
0098 bool matches(const Ref *ref) const;
0099
0100
0101 double getAscent() const;
0102
0103
0104 double getDescent() const;
0105
0106
0107 int getWMode() const;
0108
0109 #ifdef TEXTOUT_WORD_LIST
0110
0111 const GooString *getFontName() const { return fontName; }
0112
0113
0114 bool isFixedWidth() const { return flags & fontFixedWidth; }
0115 bool isSerif() const { return flags & fontSerif; }
0116 bool isSymbolic() const { return flags & fontSymbolic; }
0117 bool isItalic() const { return flags & fontItalic; }
0118 bool isBold() const { return flags & fontBold; }
0119 #endif
0120
0121 private:
0122 std::shared_ptr<GfxFont> gfxFont;
0123 #ifdef TEXTOUT_WORD_LIST
0124 GooString *fontName;
0125 int flags;
0126 #endif
0127
0128 friend class TextWord;
0129 friend class TextPage;
0130 friend class TextSelectionPainter;
0131 };
0132
0133
0134
0135
0136
0137 class POPPLER_PRIVATE_EXPORT TextWord
0138 {
0139 public:
0140
0141 TextWord(const GfxState *state, int rotA, double fontSize);
0142
0143
0144 ~TextWord();
0145
0146 TextWord(const TextWord &) = delete;
0147 TextWord &operator=(const TextWord &) = delete;
0148
0149
0150 void addChar(const GfxState *state, TextFontInfo *fontA, double x, double y, double dx, double dy, int charPosA, int charLen, CharCode c, Unicode u, const Matrix &textMatA);
0151
0152
0153
0154
0155
0156 bool addCombining(const GfxState *state, TextFontInfo *fontA, double fontSizeA, double x, double y, double dx, double dy, int charPosA, int charLen, CharCode c, Unicode u, const Matrix &textMatA);
0157
0158
0159 void merge(TextWord *word);
0160
0161
0162
0163 int primaryCmp(const TextWord *word) const;
0164
0165
0166
0167 double primaryDelta(const TextWord *word) const;
0168
0169 static int cmpYX(const void *p1, const void *p2);
0170
0171 void visitSelection(TextSelectionVisitor *visitor, const PDFRectangle *selection, SelectionStyle style);
0172
0173
0174 const TextFontInfo *getFontInfo(int idx) const { return font[idx]; }
0175
0176
0177 const TextWord *getNext() const { return next; }
0178
0179 #ifdef TEXTOUT_WORD_LIST
0180 int getLength() const { return len; }
0181 const Unicode *getChar(int idx) const { return &text[idx]; }
0182 GooString *getText() const;
0183 const GooString *getFontName(int idx) const { return font[idx]->fontName; }
0184 void getColor(double *r, double *g, double *b) const
0185 {
0186 *r = colorR;
0187 *g = colorG;
0188 *b = colorB;
0189 }
0190 void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA) const
0191 {
0192 *xMinA = xMin;
0193 *yMinA = yMin;
0194 *xMaxA = xMax;
0195 *yMaxA = yMax;
0196 }
0197 void getCharBBox(int charIdx, double *xMinA, double *yMinA, double *xMaxA, double *yMaxA) const;
0198 double getFontSize() const { return fontSize; }
0199 int getRotation() const { return rot; }
0200 int getCharPos() const { return charPos[0]; }
0201 int getCharLen() const { return charPos[len] - charPos[0]; }
0202 bool getSpaceAfter() const { return spaceAfter; }
0203 #endif
0204 bool isUnderlined() const { return underlined; }
0205 const AnnotLink *getLink() const { return link; }
0206 double getEdge(int i) const { return edge[i]; }
0207 double getBaseline() const { return base; }
0208 bool hasSpaceAfter() const { return spaceAfter; }
0209 const TextWord *nextWord() const { return next; };
0210
0211 private:
0212 void ensureCapacity(int capacity);
0213 void setInitialBounds(TextFontInfo *fontA, double x, double y);
0214
0215 int rot;
0216
0217 int wMode;
0218 double xMin, xMax;
0219 double yMin, yMax;
0220 double base;
0221 Unicode *text;
0222 CharCode *charcode;
0223 double *edge;
0224
0225 int *charPos;
0226
0227
0228 int len;
0229 int size;
0230 TextFontInfo **font;
0231 Matrix *textMat;
0232 double fontSize;
0233 bool spaceAfter;
0234
0235 bool underlined;
0236 bool invisible;
0237 TextWord *next;
0238
0239 #ifdef TEXTOUT_WORD_LIST
0240 double colorR,
0241 colorG, colorB;
0242 #endif
0243
0244 AnnotLink *link;
0245
0246 friend class TextPool;
0247 friend class TextLine;
0248 friend class TextBlock;
0249 friend class TextFlow;
0250 friend class TextWordList;
0251 friend class TextPage;
0252
0253 friend class TextSelectionPainter;
0254 friend class TextSelectionDumper;
0255 };
0256
0257
0258
0259
0260
0261 class TextPool
0262 {
0263 public:
0264 TextPool();
0265 ~TextPool();
0266
0267 TextPool(const TextPool &) = delete;
0268 TextPool &operator=(const TextPool &) = delete;
0269
0270 TextWord *getPool(int baseIdx) { return pool[baseIdx - minBaseIdx]; }
0271 void setPool(int baseIdx, TextWord *p) { pool[baseIdx - minBaseIdx] = p; }
0272
0273 int getBaseIdx(double base) const;
0274
0275 void addWord(TextWord *word);
0276
0277 private:
0278 int minBaseIdx;
0279 int maxBaseIdx;
0280 TextWord **pool;
0281
0282 TextWord *cursor;
0283 int cursorBaseIdx;
0284
0285 friend class TextBlock;
0286 friend class TextPage;
0287 };
0288
0289 struct TextFlowData;
0290
0291
0292
0293
0294
0295 class TextLine
0296 {
0297 public:
0298 TextLine(TextBlock *blkA, int rotA, double baseA);
0299 ~TextLine();
0300
0301 TextLine(const TextLine &) = delete;
0302 TextLine &operator=(const TextLine &) = delete;
0303
0304 void addWord(TextWord *word);
0305
0306
0307
0308 double primaryDelta(const TextLine *line) const;
0309
0310
0311
0312 int primaryCmp(const TextLine *line) const;
0313
0314
0315
0316
0317 int secondaryCmp(const TextLine *line) const;
0318
0319 int cmpYX(const TextLine *line) const;
0320
0321 static int cmpXY(const void *p1, const void *p2);
0322
0323 void coalesce(const UnicodeMap *uMap);
0324
0325 void visitSelection(TextSelectionVisitor *visitor, const PDFRectangle *selection, SelectionStyle style);
0326
0327
0328 const TextWord *getWords() const { return words; }
0329
0330
0331 const TextLine *getNext() const { return next; }
0332
0333
0334 bool isHyphenated() const { return hyphenated; }
0335
0336 private:
0337 TextBlock *blk;
0338 int rot;
0339 double xMin, xMax;
0340 double yMin, yMax;
0341 double base;
0342 TextWord *words;
0343 TextWord *lastWord;
0344 Unicode *text;
0345
0346 double *edge;
0347
0348 int *col;
0349 int len;
0350 int convertedLen;
0351 bool hyphenated;
0352 TextLine *next;
0353 Unicode *normalized;
0354 int normalized_len;
0355 int *normalized_idx;
0356 Unicode *ascii_translation;
0357 int ascii_len;
0358 int *ascii_idx;
0359
0360 friend class TextLineFrag;
0361 friend class TextBlock;
0362 friend class TextFlow;
0363 friend class TextWordList;
0364 friend class TextPage;
0365
0366 friend class TextSelectionPainter;
0367 friend class TextSelectionSizer;
0368 friend class TextSelectionDumper;
0369 };
0370
0371
0372
0373
0374
0375 class TextBlock
0376 {
0377 public:
0378 TextBlock(TextPage *pageA, int rotA);
0379 ~TextBlock();
0380
0381 TextBlock(const TextBlock &) = delete;
0382 TextBlock &operator=(const TextBlock &) = delete;
0383
0384 void addWord(TextWord *word);
0385
0386 void coalesce(const UnicodeMap *uMap, double fixedPitch);
0387
0388
0389 void updatePriMinMax(const TextBlock *blk);
0390
0391 static int cmpXYPrimaryRot(const void *p1, const void *p2);
0392
0393 static int cmpYXPrimaryRot(const void *p1, const void *p2);
0394
0395 int primaryCmp(const TextBlock *blk) const;
0396
0397 double secondaryDelta(const TextBlock *blk) const;
0398
0399
0400
0401 bool isBelow(const TextBlock *blk) const;
0402
0403 void visitSelection(TextSelectionVisitor *visitor, const PDFRectangle *selection, SelectionStyle style);
0404
0405
0406 const TextLine *getLines() const { return lines; }
0407
0408
0409 const TextBlock *getNext() const { return next; }
0410
0411 void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA) const
0412 {
0413 *xMinA = xMin;
0414 *yMinA = yMin;
0415 *xMaxA = xMax;
0416 *yMaxA = yMax;
0417 }
0418
0419 int getLineCount() const { return nLines; }
0420
0421 private:
0422 bool isBeforeByRule1(const TextBlock *blk1);
0423 bool isBeforeByRepeatedRule1(const TextBlock *blkList, const TextBlock *blk1);
0424 bool isBeforeByRule2(const TextBlock *blk1);
0425
0426 int visitDepthFirst(TextBlock *blkList, int pos1, TextBlock **sorted, int sortPos, bool *visited);
0427 int visitDepthFirst(TextBlock *blkList, int pos1, TextBlock **sorted, int sortPos, bool *visited, TextBlock **cache, int cacheSize);
0428
0429 TextPage *page;
0430 int rot;
0431 double xMin, xMax;
0432 double yMin, yMax;
0433 double priMin, priMax;
0434 double ExMin, ExMax;
0435 double EyMin, EyMax;
0436 int tableId;
0437 bool tableEnd;
0438
0439 TextPool *pool;
0440
0441 TextLine *lines;
0442 TextLine *curLine;
0443 int nLines;
0444 int charCount;
0445 int col;
0446 int nColumns;
0447
0448 TextBlock *next;
0449 TextBlock *stackNext;
0450
0451 friend class TextLine;
0452 friend class TextLineFrag;
0453 friend class TextFlow;
0454 friend class TextWordList;
0455 friend class TextPage;
0456 friend class TextSelectionPainter;
0457 friend class TextSelectionDumper;
0458 };
0459
0460
0461
0462
0463
0464 class TextFlow
0465 {
0466 public:
0467 TextFlow(TextPage *pageA, TextBlock *blk);
0468 ~TextFlow();
0469
0470 TextFlow(const TextFlow &) = delete;
0471 TextFlow &operator=(const TextFlow &) = delete;
0472
0473
0474 void addBlock(TextBlock *blk);
0475
0476
0477
0478
0479
0480 bool blockFits(const TextBlock *blk, const TextBlock *prevBlk) const;
0481
0482
0483 const TextBlock *getBlocks() const { return blocks; }
0484
0485
0486 const TextFlow *getNext() const { return next; }
0487
0488 private:
0489 TextPage *page;
0490 double xMin, xMax;
0491 double yMin, yMax;
0492 double priMin, priMax;
0493 TextBlock *blocks;
0494 TextBlock *lastBlk;
0495 TextFlow *next;
0496
0497 friend class TextWordList;
0498 friend class TextPage;
0499 };
0500
0501 #ifdef TEXTOUT_WORD_LIST
0502
0503
0504
0505
0506
0507 class POPPLER_PRIVATE_EXPORT TextWordList
0508 {
0509 public:
0510
0511
0512
0513
0514 TextWordList(const TextPage *text, bool physLayout);
0515
0516 ~TextWordList();
0517
0518 TextWordList(const TextWordList &) = delete;
0519 TextWordList &operator=(const TextWordList &) = delete;
0520
0521
0522 int getLength() const;
0523
0524
0525 TextWord *get(int idx);
0526
0527 private:
0528 std::vector<TextWord *> words;
0529 };
0530
0531 #endif
0532
0533 class TextWordSelection
0534 {
0535 public:
0536 TextWordSelection(const TextWord *wordA, int beginA, int endA) : word(wordA), begin(beginA), end(endA) { }
0537
0538 const TextWord *getWord() const { return word; }
0539 int getBegin() const { return begin; }
0540 int getEnd() const { return end; }
0541
0542 private:
0543 const TextWord *word;
0544 int begin;
0545 int end;
0546
0547 friend class TextSelectionPainter;
0548 friend class TextSelectionDumper;
0549 };
0550
0551
0552
0553
0554
0555 class POPPLER_PRIVATE_EXPORT TextPage
0556 {
0557 public:
0558
0559 explicit TextPage(bool rawOrderA, bool discardDiagA = false);
0560
0561 TextPage(const TextPage &) = delete;
0562 TextPage &operator=(const TextPage &) = delete;
0563
0564 void incRefCnt();
0565 void decRefCnt();
0566
0567
0568 void startPage(const GfxState *state);
0569
0570
0571 void endPage();
0572
0573
0574 void updateFont(const GfxState *state);
0575
0576
0577 void beginWord(const GfxState *state);
0578
0579
0580 void addChar(const GfxState *state, double x, double y, double dx, double dy, CharCode c, int nBytes, const Unicode *u, int uLen);
0581
0582
0583 void incCharCount(int nChars);
0584
0585
0586 void endWord();
0587
0588
0589 void addWord(TextWord *word);
0590
0591
0592 void addUnderline(double x0, double y0, double x1, double y1);
0593
0594
0595 void addLink(int xMin, int yMin, int xMax, int yMax, AnnotLink *link);
0596
0597
0598 void coalesce(bool physLayout, double fixedPitch, bool doHTML);
0599 void coalesce(bool physLayout, double fixedPitch, bool doHTML, double minColSpacing1);
0600
0601
0602
0603
0604
0605
0606
0607
0608 bool findText(const Unicode *s, int len, bool startAtTop, bool stopAtBottom, bool startAtLast, bool stopAtLast, bool caseSensitive, bool backward, bool wholeWord, double *xMin, double *yMin, double *xMax, double *yMax);
0609
0610
0611
0612
0613
0614 bool findText(const Unicode *s, int len, bool startAtTop, bool stopAtBottom, bool startAtLast, bool stopAtLast, bool caseSensitive, bool ignoreDiacritics, bool backward, bool wholeWord, double *xMin, double *yMin, double *xMax,
0615 double *yMax);
0616
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628 bool findText(const Unicode *s, int len, bool startAtTop, bool stopAtBottom, bool startAtLast, bool stopAtLast, bool caseSensitive, bool ignoreDiacritics, bool matchAcrossLines, bool backward, bool wholeWord, double *xMin, double *yMin,
0629 double *xMax, double *yMax, PDFRectangle *continueMatch, bool *ignoredHyphen);
0630
0631
0632 GooString *getText(double xMin, double yMin, double xMax, double yMax, EndOfLineKind textEOL) const;
0633
0634 void visitSelection(TextSelectionVisitor *visitor, const PDFRectangle *selection, SelectionStyle style);
0635
0636 void drawSelection(OutputDev *out, double scale, int rotation, const PDFRectangle *selection, SelectionStyle style, const GfxColor *glyph_color, const GfxColor *box_color);
0637
0638 std::vector<PDFRectangle *> *getSelectionRegion(const PDFRectangle *selection, SelectionStyle style, double scale);
0639
0640 GooString *getSelectionText(const PDFRectangle *selection, SelectionStyle style);
0641
0642 std::vector<TextWordSelection *> **getSelectionWords(const PDFRectangle *selection, SelectionStyle style, int *nLines);
0643
0644
0645
0646
0647 bool findCharRange(int pos, int length, double *xMin, double *yMin, double *xMax, double *yMax) const;
0648
0649
0650 void dump(void *outputStream, TextOutputFunc outputFunc, bool physLayout, EndOfLineKind textEOL, bool pageBreaks);
0651
0652
0653 const TextFlow *getFlows() const { return flows; }
0654
0655
0656
0657 void setMergeCombining(bool merge);
0658
0659 #ifdef TEXTOUT_WORD_LIST
0660
0661
0662
0663
0664 std::unique_ptr<TextWordList> makeWordList(bool physLayout);
0665 #endif
0666
0667 private:
0668
0669 ~TextPage();
0670
0671 void clear();
0672 void assignColumns(TextLineFrag *frags, int nFrags, bool rot) const;
0673 int dumpFragment(const Unicode *text, int len, const UnicodeMap *uMap, GooString *s) const;
0674 void adjustRotation(TextLine *line, int start, int end, double *xMin, double *xMax, double *yMin, double *yMax);
0675
0676 bool rawOrder;
0677 bool discardDiag;
0678 bool mergeCombining;
0679
0680
0681 double pageWidth, pageHeight;
0682 TextWord *curWord;
0683 int charPos;
0684
0685 TextFontInfo *curFont;
0686 double curFontSize;
0687 int nest;
0688 int nTinyChars;
0689 bool lastCharOverlap;
0690
0691 bool diagonal;
0692
0693 std::unique_ptr<TextPool> pools[4];
0694 TextFlow *flows;
0695 TextBlock **blocks;
0696 int nBlocks;
0697 int primaryRot;
0698 bool primaryLR;
0699
0700 TextWord *rawWords;
0701
0702 TextWord *rawLastWord;
0703
0704 std::vector<std::unique_ptr<TextFontInfo>> fonts;
0705
0706 double lastFindXMin,
0707 lastFindYMin;
0708 bool haveLastFind;
0709
0710 std::vector<std::unique_ptr<TextUnderline>> underlines;
0711 std::vector<std::unique_ptr<TextLink>> links;
0712
0713 int refCnt;
0714
0715 friend class TextLine;
0716 friend class TextLineFrag;
0717 friend class TextBlock;
0718 friend class TextFlow;
0719 friend class TextWordList;
0720 friend class TextSelectionPainter;
0721 friend class TextSelectionDumper;
0722 };
0723
0724
0725
0726
0727
0728 class POPPLER_PRIVATE_EXPORT ActualText
0729 {
0730 public:
0731
0732 explicit ActualText(TextPage *out);
0733 ~ActualText();
0734
0735 ActualText(const ActualText &) = delete;
0736 ActualText &operator=(const ActualText &) = delete;
0737
0738 void addChar(const GfxState *state, double x, double y, double dx, double dy, CharCode c, int nBytes, const Unicode *u, int uLen);
0739 void begin(const GfxState *state, const GooString *text);
0740 void end(const GfxState *state);
0741
0742 private:
0743 TextPage *text;
0744
0745 GooString *actualText;
0746 double actualTextX0;
0747 double actualTextY0;
0748 double actualTextX1;
0749 double actualTextY1;
0750 int actualTextNBytes;
0751 };
0752
0753
0754
0755
0756
0757 class POPPLER_PRIVATE_EXPORT TextOutputDev : public OutputDev
0758 {
0759 public:
0760 static double minColSpacing1_default;
0761
0762
0763
0764
0765
0766
0767
0768 TextOutputDev(const char *fileName, bool physLayoutA, double fixedPitchA, bool rawOrderA, bool append, bool discardDiagA = false);
0769
0770
0771
0772
0773
0774
0775 TextOutputDev(TextOutputFunc func, void *stream, bool physLayoutA, double fixedPitchA, bool rawOrderA, bool discardDiagA = false);
0776
0777
0778 ~TextOutputDev() override;
0779
0780
0781 virtual bool isOk() { return ok; }
0782
0783
0784
0785
0786
0787 bool upsideDown() override { return true; }
0788
0789
0790 bool useDrawChar() override { return true; }
0791
0792
0793
0794 bool interpretType3Chars() override { return false; }
0795
0796
0797 bool needNonText() override { return false; }
0798
0799
0800
0801 bool needCharCount() override { return true; }
0802
0803
0804
0805
0806 void startPage(int pageNum, GfxState *state, XRef *xref) override;
0807
0808
0809 void endPage() override;
0810
0811
0812 void restoreState(GfxState *state) override;
0813
0814
0815 void updateFont(GfxState *state) override;
0816
0817
0818 void beginString(GfxState *state, const GooString *s) override;
0819 void endString(GfxState *state) override;
0820 void drawChar(GfxState *state, double x, double y, double dx, double dy, double originX, double originY, CharCode c, int nBytes, const Unicode *u, int uLen) override;
0821 void incCharCount(int nChars) override;
0822 void beginActualText(GfxState *state, const GooString *text) override;
0823 void endActualText(GfxState *state) override;
0824
0825
0826 void stroke(GfxState *state) override;
0827 void fill(GfxState *state) override;
0828 void eoFill(GfxState *state) override;
0829
0830
0831 void processLink(AnnotLink *link) override;
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842 bool findText(const Unicode *s, int len, bool startAtTop, bool stopAtBottom, bool startAtLast, bool stopAtLast, bool caseSensitive, bool backward, bool wholeWord, double *xMin, double *yMin, double *xMax, double *yMax) const;
0843
0844
0845 GooString *getText(double xMin, double yMin, double xMax, double yMax) const;
0846
0847
0848
0849
0850 bool findCharRange(int pos, int length, double *xMin, double *yMin, double *xMax, double *yMax) const;
0851
0852 void drawSelection(OutputDev *out, double scale, int rotation, const PDFRectangle *selection, SelectionStyle style, const GfxColor *glyph_color, const GfxColor *box_color);
0853
0854 std::vector<PDFRectangle *> *getSelectionRegion(const PDFRectangle *selection, SelectionStyle style, double scale);
0855
0856 GooString *getSelectionText(const PDFRectangle *selection, SelectionStyle style);
0857
0858
0859
0860 void setMergeCombining(bool merge);
0861
0862 #ifdef TEXTOUT_WORD_LIST
0863
0864
0865
0866
0867 std::unique_ptr<TextWordList> makeWordList();
0868 #endif
0869
0870
0871
0872 TextPage *takeText();
0873
0874
0875 void enableHTMLExtras(bool doHTMLA) { doHTML = doHTMLA; }
0876
0877
0878
0879 const TextFlow *getFlows() const;
0880
0881 static constexpr EndOfLineKind defaultEndOfLine()
0882 {
0883 #if defined(_WIN32)
0884 return eolDOS;
0885 #else
0886 return eolUnix;
0887 #endif
0888 }
0889 void setTextEOL(EndOfLineKind textEOLA) { textEOL = textEOLA; }
0890 void setTextPageBreaks(bool textPageBreaksA) { textPageBreaks = textPageBreaksA; }
0891 double getMinColSpacing1() const { return minColSpacing1; }
0892 void setMinColSpacing1(double val) { minColSpacing1 = val; }
0893
0894 private:
0895 TextOutputFunc outputFunc;
0896 void *outputStream;
0897 bool needClose;
0898
0899 TextPage *text;
0900 bool physLayout;
0901
0902 double fixedPitch;
0903
0904
0905 double minColSpacing1;
0906 bool rawOrder;
0907 bool discardDiag;
0908
0909
0910 bool doHTML;
0911 bool ok;
0912 bool textPageBreaks;
0913 EndOfLineKind textEOL;
0914
0915 ActualText *actualText;
0916 };
0917
0918 #endif