PDF の検索語を強調表示します。斜体のテキストが四角形で囲まれるのはなぜですか?

斜体フォントは、検索された四角形の領域を囲む四角形よりも必ずしも小さくするわけではありません。 4 隅の方向情報を保持する必要がある場合は、quads=True の結果を直接使用して強調表示を追加します。ハイライト表示が正しいかどうかを判断するために面積差のしきい値を使用しないでください。

イタリック体テキストの検索ハイライト ボックスが歪んでいる場合、多くの場合、フォント自体に問題があるのではなく、ハイライトに使用される幾何学オブジェクトが間違って選択されていることが原因です。この記事は、PyMuPDF を使用して PDF テキストの配置を処理する開発者を対象としています。斜体テキストまたは回転テキストの強調表示が正しいかどうかを判断するために囲み四角形 (Rect)を使用できない理由と、さまざまな状況でそれを処理する方法について説明します。

この記事を読むと、検索結果に Quad と Rect のどちらを使用するかを決定し、検索時にヒットなし、複数の行、複数のヒット、および CropBox のトリミングを処理する方法を知り、幾何学的配置の範囲を超えている問題を理解できるようになります。

全文は合成サンプルを使用して実証されており、コードは隔離された環境でのサンプル チェックに合格していますが、これはすべての実際のファイルや製品の効果を保証するものではありません。重要な書類を処理する前に、原本を保管し、以下の範囲および受理項目に従って確認してください。

斜体のテキストを検索ハイライトするには、Quad または Rect を選択しますか?一文の結論

斜体フォントは、検索によって得られる四角形の領域を、必ずしも外接四角形よりも小さくするわけではありません。四隅の方向情報を保持したい場合は、quads=Trueの結果をそのまま使用してハイライトを追加してください。ハイライト表示が正しいかどうかを判断するために、面積差のしきい値を使用しないでください。

あなたの状況推奨される実践方法理由
斜体または回転されたテキスト、四隅の向きを保持する必要があるquads=True の結果を直接使用してハイライトを追加しますQuad は 4 隅の方向情報を保持します
面積差のしきい値を使用して、強調表示が正しいかどうかを判断したいと考えています。これをしないでくださいイタリック体は必ずしも Quad 領域を小さくするわけではなく、しきい値の判定は信頼できません。
検索語は複数の行にまたがっており、エンジンはそれらを同じ語彙単位として認識しません。返されたクワッド フラグメントをすべて保持し、ハイライトを個別に描画しますRect に強制的にマージすると、中央の空白のセマンティクスが失われます。
ページには CropBox トリミングが含まれていますCropBox を復元した後、コンテンツがまだ表示可能領域内にあることを確認します。search_for によって返される座標は、回転されていない元のページ空間に基づいており、get_text がデフォルトで切り取られた領域を無視するとは想定できません。
複数のヒットページ番号を項目ごとに保持し、1 つずつ処理します最初の位置を処理するだけでは残りの位置が失われます

斜体のテキストが正しく表示されないのはなぜですか?

多くの人は、デフォルトで斜体文字を囲む四角形が Quad よりもはるかに大きいと想定するため、Rect を使用してハイライトすると「フレームのずれ」が発生します。実際、斜体フォントは検索された Quad の面積をそれを囲む四角形より小さくするとは限らないため、強調表示が正しいかどうかを判断するために面積の差を使用することは信頼できません。

本当に必要なのは、四隅の向き情報を保持することです。 Quad はたまたまこの情報を記録しており、それを使用してハイライトを直接追加する方が、囲む四角形を使用して形状を推測するよりも信頼性が高くなります。

自己完結型の構成例

依存関係の例については、インポート リストを参照してください。コードはメモリ内に入力を構築するため、外部ファイルを実行する必要はありません。操作記録は別途提供されており、すべての文書が本物であることを保証するものではありません。

import pymupdf
with pymupdf.open() as source:
    page = source.new_page(width=300, height=300)
    page.insert_text((100, 250), "Searchable", fontsize=14, rotate=90)
    hits = page.search_for("Searchable", quads=True)
    assert len(hits) == 1
    assert isinstance(hits[0], pymupdf.Quad)
    page.add_highlight_annot(hits)
    assert page.search_for("Missing", quads=True) == []
    raw = source.tobytes()
with pymupdf.open(stream=raw, filetype="pdf") as doc:
    page = doc[0]  # Keep the owning page alive while using annotations.
    annotations = list(page.annots())
    assert len(annotations) == 1
    assert len(annotations[0].vertices) == 4

正しい出力と境界入力処理

上記の合成例は、Quad の動作を検証するために使用されるメモリ内 PDF を生成します。以下に、いくつかの一般的な境界入力を示します。

1. 検索語が複数行にまたがる

検索用語が改行にまたがっており、エンジンがそれを同じ語彙単位として認識しない場合、search_for は空のリストを返すか、部分的なフラグメントのみに一致する可能性があります。

  • 隣接しない複数の Quad を 1 つの Rect に強制的にマージしないでください。マージしないと、中央の空白のセマンティクスが失われます。
  • 返されたクアッド フラグメントをすべて保持し、ハイライトを個別に描画します。

2. 検索語に通常の特殊文字が含まれています

検索語に通常の特殊文字がエスケープされずに含まれている場合、結果は期待どおりにならない可能性があります。入力文字列は呼び出す前に安全に処理する必要があります。

3. CropBox のトリミング

もしページにCropBoxクリップがある場合、search_forが返す座標は回転されていない元のページ空間に基づいています。 CropBoxを復元した後、コンテンツがまだ表示可能な領域内にあるかを確認する必要があります。get_textがトリミング領域をデフォルトで無視しているとは限りません。

受理基準と手動審査の境界

この解法は幾何学的配置問題のみを解きます。 以下の状況はクアッド対レクト選択の問題には該当しません。

  • PDF自体のテキスト層への損傷;
  • フォント埋め込み異常;
  • 隠れた層の存在。

そのような場合、search_forの結果は全く信頼できないことがあり、手動で確認するか再審査する必要があります。 サンプルコードは幾何学的特性のみを検証します。エンドツーエンドの効果は特定の文書タイプに基づいて評価する必要があります。

特定例外の処理決定

観察何をすべきかそして判断されるべきではありません
捜索しても結果は見つかりませんでしたテキストレイヤーとキーワードを確認してください空のハイライトは作成されません
テキストの回転クアッドの四隅を保持する面積差を使わずに正確に推測する方法
そして多くの場所で的を射ています各項目はページ番号とともに保持すべきです最初のものだけに対処しないでください

📊 コア比較

ターゲット保存可能な情報適用シナリオ注記
Quad四角斜体や回転文字は正確なハイライトが必要ですquads=Trueの結果を直接活用してください
レクト(外部長方形)外部接触範囲横テキストの簡単な選択斜体や回転文字は箱外に表示され、正確性の確認に適さない場合があります
マージド・レクト全体的な範囲クロスライン検索にはおすすめしませんこれだと中央の空白部分の意味が失われてしまいます

🎯 どの方法があなたに合いますか?

もし......

  • テキストコーナーは保存が必要です:quads=Trueの結果を直接使用してハイライトを追加してください。
  • 面積差の閾値でハイライトが正しいかどうか判断したい場合:やめてください。斜体フォントは必ずしも四角形の面積を小さくするわけではありません。
  • 検索語が線をまたいでいる場合:すべてのクアッドセグメントを保持し、別々にハイライトし、単一のRectに統合しないでください。
  • cropBoxトリミングによるページの処理:CropBoxを復元した後、コンテンツがまだ表示可能な領域内にあるか確認してください。

このチェックリストを文書翻訳に使ってください

まず、ページの順序、出典の場所、テキストの整合性を徹底的に確認し、同じ匿名化されたサンプルを翻訳プロセスに渡します。 翻訳後も、タイトル、本文、キャプションが正しく対応しているかどうかを確認する必要があります。テキストが流暢かどうかだけで判断するだけでは不十分です。

OmniDoc(製品エントリー)はマルチフォーマットの文書翻訳ポータルを提供しており、公式ウェブサイトではOCR、用語、バイリンガル参照機能が導入されています。 ファイルから直接読み始めたいチームにとっては、実際のサンプルを使って評価する価値のある道です。 アップロード許可を得た匿名ファイルを使用し、この記事のチェックリストで結果を検証してください。 これは、OmniDocがこの記事で言及されたオープンソースライブラリや内部アルゴリズムを使用していることを主張するものではなく、例が製品性能テストの代替でもあるわけではありません。

参考文献

❓ よくある質問(FAQ)

1. イタリック体のテキストは必ずしもクアッドの面積を小さくするのでしょうか?

必ずしもそうとは限りません。 斜体のグリフは必ずしも外部長方形よりも小さな四角形の面積を生み出すわけではないため、面積差だけでハイライトが正しいかどうかを判断することはできません。

2. クアッドの四角情報はいつ保持すべきか?

4つの角の方向情報を保持したい場合は、quads=Trueの結果を直接使ってハイライトを加えるべきです。

3. 検索語が境界線を越えて的確でない場合、どうすればよいでしょうか?

空のハイライトは作成しないでください。まずテキストレイヤーとキーワードを確認してください。 セグメントの一部だけが戻される場合は、すべての返還されたクアッドセグメントを個別に保持しハイライトし、強制的に単一のレクトに統合するのではなく、別々にハイライトされるべきです。

4. このページにはCropBoxが含まれています。カットする際に注意すべき点は何ですか?

search_forが返す座標は、回転されていない元のページ空間に基づいています。 CropBoxを復元した後、コンテンツがまだビューライン内にあるかを確認する必要があります。get_textがトリミング領域をデフォルトで無視しているとは限りません。

📝 概要

イタリック体のハイライトや回転テキストはクアッドに基づいており、各項目のページ番号や隅情報は保持してください。 テキスト層の破損や異常なフォント埋め込みなどの問題は、依然として手動のレビューや再OCRが必要です。

OmniDocデスクトップ版の無料ダウンロード:ドキュメント、表、プレゼンテーション、PDFを一か所で管理できます

更新日 2026-11-13