2

私は PDFLib のひどいラッパーを使用していますが、これは PDFLib が文字制限 (セルあたり約 1600 文字) を超えるセルで抱えている問題を処理しません。そのため、大きな段落をセルにきちんと収まる小さな文字列に分割し、単語を分割せずに、できるだけ行末に近づける必要があります。これを効率的に行う方法について完全に困惑しています(妥当な時間内に実行する必要があります)

上記の単語と行の要件を無視して、文字の長さだけに基づいてブロックを部分文字列に分割する私のコードは次のとおりです。

SPE_* 関数は、ラッパー クラスの静的関数です。SetNextCellStyle 呼び出しは、セルのアウトラインの周りにボックスを描画するために使用されます。BeginRow は、テキスト行を開始するために必要です。EndRow は、テキストの行を終了するために必要であり、BeginRow の後に呼び出す必要があり、事前に設定された列数が完全に満たされていない場合、エラーが生成されます。AddCell は、列の 2 番目のパラメーター数に文字列を追加します。

function SPE_divideText($string,$cols,$indent,$showBorders=false)
{
$strLim = 1500;
$index = 0;
$maxIndex = round((strlen($string) / 1500-.5));
$retArr= array();
  while(substr($string, $strLim -1500,$strLim)!=FALSE)
    {
    $retArr[$index] = substr($string, $strLim -1500,$strLim);
            $strLim+=1500;

            SPE_BeginRow();
            SPE_SetNextCellStyle('cell-padding', '0');
            if($indent>0)
              {

              SPE_Empty($indent);
              }
            if($showBorders)
              {
            SPE_SetNextCellStyle('border-left','1.5');
            SPE_SetNextCellStyle('border-right','1.5');

              if($index == 0)
                {
                SPE_SetNextCellStyle('border-top','1.5');
                }
                if($index== $maxIndex)
                  {
               SPE_SetNextCellStyle('border-bottom','1.5');

                  }
              }

            SPE_AddCell($retArr[$index],$cols-$indent);
            SPE_EndRow();
            $index++;
    }
}

助けてくれてありがとう!

4

1 に答える 1

1

このようなものが機能するはずです。

function substr_at_word_boundary($string, $chars = 100)
{
    preg_match('/^.{0,' . $chars. '}(?:.*?)\b/iu', $string, $matches);
    $new_string = $matches[0];
    return ($new_string === $string) ? $string : $new_string;
}

$string = substr_at_word_boundary($string, 1600)
于 2012-06-25T17:34:12.197 に答える