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

📄 textoutputdev.cc

📁 将pdf文档转换为高质量的html文档
💻 CC
📖 第 1 页 / 共 5 页
字号:
		      word0->len * sizeof(Unicode))) {	    switch (rot) {	    case 0:	    case 2:	      found = fabs(word0->xMin - word2->xMin) < priDelta &&		      fabs(word0->xMax - word2->xMax) < priDelta &&		      fabs(word0->yMin - word2->yMin) < secDelta &&		      fabs(word0->yMax - word2->yMax) < secDelta;	      break;	    case 1:	    case 3:	      found = fabs(word0->xMin - word2->xMin) < secDelta &&		      fabs(word0->xMax - word2->xMax) < secDelta &&		      fabs(word0->yMin - word2->yMin) < priDelta &&		      fabs(word0->yMax - word2->yMax) < priDelta;	      break;	    }	  }	  if (found) {	    break;	  }	}	if (found) {	  break;	}      }      if (found) {	if (word1) {	  word1->next = word2->next;	} else {	  pool->setPool(idx1, word2->next);	}	delete word2;      } else {	word0 = word0->next;      }    }  }  // build the lines  curLine = NULL;  poolMinBaseIdx = pool->minBaseIdx;  charCount = 0;  nLines = 0;  while (1) {    // find the first non-empty line in the pool    for (;	 poolMinBaseIdx <= pool->maxBaseIdx && !pool->getPool(poolMinBaseIdx);	 ++poolMinBaseIdx) ;    if (poolMinBaseIdx > pool->maxBaseIdx) {      break;    }    // look for the left-most word in the first four lines of the    // pool -- this avoids starting with a superscript word    startBaseIdx = poolMinBaseIdx;    for (baseIdx = poolMinBaseIdx + 1;	 baseIdx < poolMinBaseIdx + 4 && baseIdx <= pool->maxBaseIdx;	 ++baseIdx) {      if (!pool->getPool(baseIdx)) {	continue;      }      if (pool->getPool(baseIdx)->primaryCmp(pool->getPool(startBaseIdx))	  < 0) {	startBaseIdx = baseIdx;      }    }    // create a new line    word0 = pool->getPool(startBaseIdx);    pool->setPool(startBaseIdx, word0->next);    word0->next = NULL;    line = new TextLine(this, word0->rot, word0->base);    line->addWord(word0);    lastWord = word0;    // compute the search range    fontSize = word0->fontSize;    minBase = word0->base - maxIntraLineDelta * fontSize;    maxBase = word0->base + maxIntraLineDelta * fontSize;    minBaseIdx = pool->getBaseIdx(minBase);    maxBaseIdx = pool->getBaseIdx(maxBase);    // find the rest of the words in this line    while (1) {      // find the left-most word whose baseline is in the range for      // this line      bestWordBaseIdx = 0;      bestWord0 = bestWord1 = NULL;      for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) {	for (word0 = NULL, word1 = pool->getPool(baseIdx);	     word1;	     word0 = word1, word1 = word1->next) {	  if (word1->base >= minBase &&	      word1->base <= maxBase &&	      (delta = lastWord->primaryDelta(word1)) >=	        minCharSpacing * fontSize) {	    if (delta < maxWordSpacing * fontSize &&		(!bestWord1 || word1->primaryCmp(bestWord1) < 0)) {	      bestWordBaseIdx = baseIdx;	      bestWord0 = word0;	      bestWord1 = word1;	    }	    break;	  }	}      }      if (!bestWord1) {	break;      }      // remove it from the pool, and add it to the line      if (bestWord0) {	bestWord0->next = bestWord1->next;      } else {	pool->setPool(bestWordBaseIdx, bestWord1->next);      }      bestWord1->next = NULL;      line->addWord(bestWord1);      lastWord = bestWord1;    }    // add the line    if (curLine && line->cmpYX(curLine) > 0) {      line0 = curLine;      line1 = curLine->next;    } else {      line0 = NULL;      line1 = lines;    }    for (;	 line1 && line->cmpYX(line1) > 0;	 line0 = line1, line1 = line1->next) ;    if (line0) {      line0->next = line;    } else {      lines = line;    }    line->next = line1;    curLine = line;    line->coalesce(uMap);    charCount += line->len;    ++nLines;  }  // sort lines into xy order for column assignment  lineArray = (TextLine **)gmallocn(nLines, sizeof(TextLine *));  for (line = lines, i = 0; line; line = line->next, ++i) {    lineArray[i] = line;  }  qsort(lineArray, nLines, sizeof(TextLine *), &TextLine::cmpXY);  // column assignment  nColumns = 0;  for (i = 0; i < nLines; ++i) {    line0 = lineArray[i];    col1 = 0;    for (j = 0; j < i; ++j) {      line1 = lineArray[j];      if (line1->primaryDelta(line0) >= 0) {	col2 = line1->col[line1->len] + 1;      } else {	k = 0; // make gcc happy	switch (rot) {	case 0:	  for (k = 0;	       k < line1->len &&		 line0->xMin >= 0.5 * (line1->edge[k] + line1->edge[k+1]);	       ++k) ;	  break;	case 1:	  for (k = 0;	       k < line1->len &&		 line0->yMin >= 0.5 * (line1->edge[k] + line1->edge[k+1]);	       ++k) ;	  break;	case 2:	  for (k = 0;	       k < line1->len &&		 line0->xMax <= 0.5 * (line1->edge[k] + line1->edge[k+1]);	       ++k) ;	  break;	case 3:	  for (k = 0;	       k < line1->len &&		 line0->yMax <= 0.5 * (line1->edge[k] + line1->edge[k+1]);	       ++k) ;	  break;	}	col2 = line1->col[k];      }      if (col2 > col1) {	col1 = col2;      }    }    for (k = 0; k <= line0->len; ++k) {      line0->col[k] += col1;    }    if (line0->col[line0->len] > nColumns) {      nColumns = line0->col[line0->len];    }  }  gfree(lineArray);}void TextBlock::updatePriMinMax(TextBlock *blk) {  double newPriMin, newPriMax;  GBool gotPriMin, gotPriMax;  gotPriMin = gotPriMax = gFalse;  newPriMin = newPriMax = 0; // make gcc happy  switch (page->primaryRot) {  case 0:  case 2:    if (blk->yMin < yMax && blk->yMax > yMin) {      if (blk->xMin < xMin) {	newPriMin = blk->xMax;	gotPriMin = gTrue;      }      if (blk->xMax > xMax) {	newPriMax = blk->xMin;	gotPriMax = gTrue;      }    }    break;  case 1:  case 3:    if (blk->xMin < xMax && blk->xMax > xMin) {      if (blk->yMin < yMin) {	newPriMin = blk->yMax;	gotPriMin = gTrue;      }      if (blk->yMax > yMax) {	newPriMax = blk->yMin;	gotPriMax = gTrue;      }    }    break;  }  if (gotPriMin) {    if (newPriMin > xMin) {      newPriMin = xMin;    }    if (newPriMin > priMin) {      priMin = newPriMin;    }  }  if (gotPriMax) {    if (newPriMax < xMax) {      newPriMax = xMax;    }    if (newPriMax < priMax) {      priMax = newPriMax;    }  }}int TextBlock::cmpXYPrimaryRot(const void *p1, const void *p2) {  TextBlock *blk1 = *(TextBlock **)p1;  TextBlock *blk2 = *(TextBlock **)p2;  double cmp;  cmp = 0; // make gcc happy  switch (blk1->page->primaryRot) {  case 0:    if ((cmp = blk1->xMin - blk2->xMin) == 0) {      cmp = blk1->yMin - blk2->yMin;    }    break;  case 1:    if ((cmp = blk1->yMin - blk2->yMin) == 0) {      cmp = blk2->xMax - blk1->xMax;    }    break;  case 2:    if ((cmp = blk2->xMax - blk1->xMax) == 0) {      cmp = blk2->yMin - blk1->yMin;    }    break;  case 3:    if ((cmp = blk2->yMax - blk1->yMax) == 0) {      cmp = blk1->xMax - blk2->xMax;    }    break;  }  return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;}int TextBlock::cmpYXPrimaryRot(const void *p1, const void *p2) {  TextBlock *blk1 = *(TextBlock **)p1;  TextBlock *blk2 = *(TextBlock **)p2;  double cmp;  cmp = 0; // make gcc happy  switch (blk1->page->primaryRot) {  case 0:    if ((cmp = blk1->yMin - blk2->yMin) == 0) {      cmp = blk1->xMin - blk2->xMin;    }    break;  case 1:    if ((cmp = blk2->xMax - blk1->xMax) == 0) {      cmp = blk1->yMin - blk2->yMin;    }    break;  case 2:    if ((cmp = blk2->yMin - blk1->yMin) == 0) {      cmp = blk2->xMax - blk1->xMax;    }    break;  case 3:    if ((cmp = blk1->xMax - blk2->xMax) == 0) {      cmp = blk2->yMax - blk1->yMax;    }    break;  }  return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;}int TextBlock::primaryCmp(TextBlock *blk) {  double cmp;  cmp = 0; // make gcc happy  switch (rot) {  case 0:    cmp = xMin - blk->xMin;    break;  case 1:    cmp = yMin - blk->yMin;    break;  case 2:    cmp = blk->xMax - xMax;    break;  case 3:    cmp = blk->yMax - yMax;    break;  }  return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;}double TextBlock::secondaryDelta(TextBlock *blk) {  double delta;  delta = 0; // make gcc happy  switch (rot) {  case 0:    delta = blk->yMin - yMax;    break;  case 1:    delta = xMin - blk->xMax;    break;  case 2:    delta = yMin - blk->yMax;    break;  case 3:    delta = blk->xMin - xMax;    break;  }  return delta;}GBool TextBlock::isBelow(TextBlock *blk) {  GBool below;  below = gFalse; // make gcc happy  switch (page->primaryRot) {  case 0:    below = xMin >= blk->priMin && xMax <= blk->priMax &&            yMin > blk->yMin;    break;  case 1:    below = yMin >= blk->priMin && yMax <= blk->priMax &&            xMax < blk->xMax;    break;  case 2:    below = xMin >= blk->priMin && xMax <= blk->priMax &&            yMax < blk->yMax;    break;  case 3:    below = yMin >= blk->priMin && yMax <= blk->priMax &&            xMin > blk->xMin;    break;  }  return below;}//------------------------------------------------------------------------// TextFlow//------------------------------------------------------------------------TextFlow::TextFlow(TextPage *pageA, TextBlock *blk) {  page = pageA;  xMin = blk->xMin;  xMax = blk->xMax;  yMin = blk->yMin;  yMax = blk->yMax;  priMin = blk->priMin;  priMax = blk->priMax;  blocks = lastBlk = blk;  next = NULL;}TextFlow::~TextFlow() {  TextBlock *blk;  while (blocks) {    blk = blocks;    blocks = blocks->next;    delete blk;  }}void TextFlow::addBlock(TextBlock *blk) {  if (lastBlk) {    lastBlk->next = blk;  } else {    blocks = blk;  }  lastBlk = blk;  if (blk->xMin < xMin) {    xMin = blk->xMin;  }  if (blk->xMax > xMax) {    xMax = blk->xMax;  }  if (blk->yMin < yMin) {    yMin = blk->yMin;  }  if (blk->yMax > yMax) {    yMax = blk->yMax;  }}GBool TextFlow::blockFits(TextBlock *blk, TextBlock *prevBlk) {  GBool fits;  // lower blocks must use smaller fonts  if (blk->lines->words->fontSize > lastBlk->lines->words->fontSize) {    return gFalse;  }  fits = gFalse; // make gcc happy  switch (page->primaryRot) {  case 0:    fits = blk->xMin >= priMin && blk->xMax <= priMax;    break;  case 1:    fits = blk->yMin >= priMin && blk->yMax <= priMax;    break;  case 2:    fits = blk->xMin >= priMin && blk->xMax <= priMax;    break;  case 3:    fits = blk->yMin >= priMin && blk->yMax <= priMax;    break;  }  return fits;}#if TEXTOUT_WORD_LIST//------------------------------------------------------------------------// TextWordList//------------------------------------------------------------------------TextWordList::TextWordList(TextPage *text, GBool physLayout) {  TextFlow *flow;  TextBlock *blk;  TextLine *line;  TextWord *word;  TextWord **wordArray;  int nWords, i;  words = new GList();  if (text->rawOrder) {    for (word = text->rawWords; word; word = word->next) {      words->append(word);    }  } else if (physLayout) {    // this is inefficient, but it's also the least useful of these    // three cases    nWords = 0;    for (flow = text->flows; flow; flow = flow->next) {      for (blk = flow->blocks; blk; blk = blk->next) {	for (line = blk->lines; line; line = line->next) {	  for (word = line->words; word; word = word->next) {	    ++nWords;	  }	}      }    }    wordArray = (TextWord **)gmallocn(nWords, sizeof(TextWord *));    i = 0;    for (flow = text->flows; flow; flow = flow->next) {      for (blk = flow->blocks; blk; blk = blk->next) {	for (line = blk->lines; line; line = line->next) {	  for (word = line->words; word; word = word->next) {	    wordArray[i++] = word;	  }	}      }    }    qsort(wordArray, nWords, sizeof(TextWord *), &TextWord::cmpYX);    for (i = 0; i < nWords; ++i) {      words->append(wordArray[i]);    }    gfree(wordArray);  } else {    for (flow = text->flows; flow; flow = flow->next) {      for (blk = flow->blocks; blk; blk = blk->next) {	for (line = blk->lines; line; line = line->next) {	  for (word = line->words; word; word = word->next) {	    words->append(word);	  }	}      }

⌨️ 快捷键说明

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