PDFファイルのテキストハイライト

### 1. 必要なライブラリのインポート

```python
from reportlab.lib.pagesizes import landscape, A3
from reportlab.pdfgen.canvas import Canvas
import fitz  # PyMuPDF
import os
import shutil
from PyPDF2 import PdfReader, PdfWriter
```
この部分では、PDF処理に必要なライブラリをインポートしています。`reportlab`はPDFの生成、`fitz`はPDFの読み取りと操作、`PyPDF2`はPDFのマージや分割に使用されます。

### 2. ハイライトのための関数

```python
def draw_rectangles(pdf_file, coordinates_by_text, text_color_map):
    c = Canvas(pdf_file, pagesize=landscape(A3))  # A3の横向き設定
    colors = [
        "#FFD700",  # Gold
        "#00FFFF",  # Cyan
        "#800080",  # Purple
        "#ADFF2F",  # GreenYellow
        "#FF6347",  # Tomato
        "#4682B4",  # SteelBlue
        "#FF00FF",  # Magenta
        "#FF69B4",  # HotPink
        "#00CED1",  # DarkTurquoise
        "#228B22",  # DarkGreen
    ]

    idx = 0
    for search_string, coordinates in coordinates_by_text.items():
        if search_string not in text_color_map:
            text_color_map[search_string] = colors[idx % len(colors)]  # テキストに色を関連付ける
            idx += 1

        color = text_color_map[search_string]  # テキストに関連付けられた色を取得

        for coord in coordinates:
            x1, y1, x2, y2 = coord
            _, height = landscape(A3)
            y1_flipped = height - y1
            y2_flipped = height - y2
            
            c.setStrokeColor(color)  # 四角形の枠線の色を設定
            c.setFillColor(color)    # 四角形の塗りつぶしの色を設定
            c.rect(x1, y1_flipped, x2 - x1, y2_flipped - y1_flipped, stroke=1, fill=1)  # 四角形を描画して塗りつぶす

    c.save()
```
この関数は、指定された座標に色付きの四角形を描画し、テキストをハイライトします。

### 3. PDFからページを抽出する関数

```python
def extract_page_with_text(pdf_path, target_text, output_path):
    pdf_document = fitz.open(pdf_path)
    matching_pages = [page_number for page_number in range(pdf_document.page_count) if pdf_document[page_number].search_for(target_text)]

    if matching_pages:
        pdf_output = fitz.open()
        for page_number in matching_pages:
            pdf_output.insert_pdf(pdf_document, from_page=page_number, to_page=page_number)

        pdf_output.save(output_path)
        pdf_output.close()
        print(f"ページに'{target_text}'を含むPDFを保存しました: {output_path}")
    else:
        print(f"指定されたテキスト '{target_text}' は見つかりませんでした。")
```
この関数は、指定されたテキストが含まれるページを抽出し、新しいPDFとして保存します。

### 4. テキスト検索と座標取得

```python
def highlight_text(pdf_path):
    pdf_document = fitz.open(pdf_path)

    search_strings = [
        f"FAW1-{i}" for i in range(20, 30)
    ] + [
        f"FAW2-{i}" for i in range(1, 10)
    ] + [
        f"FAG2-{i}" for i in range(1, 10)
    ] + [
        f"FAT1-{i}" for i in range(20, 30)
    ] + [
        f"FAS1-{i}" for i in range(10, 20)
    ] + [
        f"SS1-{i}" for i in range(1, 10)
    ]

    text_coordinates = {search_string: [] for search_string in search_strings}
    text_color_map = {}

    for page_num in range(len(pdf_document)):
        page = pdf_document.load_page(page_num)
        for search_string in search_strings:
            text_instances = page.search_for(search_string)
            text_coordinates[search_string].extend(text_instances)

    return text_coordinates, text_color_map
```
この関数は、PDF内で特定の文字列の座標を検索し、それらを辞書形式で返します。

### 5. PDFの重ね合わせとマージ

```python
def overlay_pdfs(input_pdf, overlay_pdf, output_pdf):
    reader_main = PdfReader(input_pdf)
    reader_overlay = PdfReader(overlay_pdf)

    writer = PdfWriter()
    for i in range(len(reader_main.pages)):
        page_main = reader_main.pages[i]
        page_overlay = reader_overlay.pages[i] if i < len(reader_overlay.pages) else None
        
        if page_overlay:
            page_main.merge_page(page_overlay)
        
        writer.add_page(page_main)

    with open(output_pdf, "wb") as f:
        writer.write(f)
```
この関数は、二つのPDFファイルを重ね合わせて新しいPDFファイルを生成します。

### 6. 不要なファイル削除

```python
desktop_path = os.path.expanduser("~/Desktop")
for filename in os.listdir(desktop_path):
    if filename.endswith(".pdf") and filename != "図面一式.pdf":
        file_path = os.path.join(desktop_path, filename)
        os.remove(file_path)
        print(f"{filename} を削除しました")
```
この部分では、指定された条件に従って不要なPDFファイルを削除します。

### 7. 基礎断面図の処理

```python
source_pdf_path = r"Z:\(DATA) paltio\230801基礎断面\図面一式-基礎断面図(基礎解析).pdf"
desktop_path = os.path.expanduser("~/Desktop")
target_pdf_path = os.path.join(desktop_path, "図面一式-基礎断面図(基礎解析).pdf")
shutil.copyfile(source_pdf_path, target_pdf_path)

def save_single_page(pdf_path, page_number, output_folder):
    pdf_document = fitz.open(pdf_path)
    output_path = os.path.join(output_folder, f"page_{page_number}.pdf")
    
    if page_number < pdf_document.page_count:
        single_page_pdf = fitz.open()
        single_page_pdf.insert_pdf(pdf_document, from_page=page_number, to_page=page_number)
        single_page_pdf.save(output_path)
        single_page_pdf.close()
```
ここでは、基礎断面図のPDFファイルをデスクトップにコピーし、そのページを個別に保存するための関数が定義されています。

### 8. 各ページからハイライトする座標リストアップ

```python
coordinates_by_page = {}
for filename in os.listdir(extracted_pages_folder):
    if filename.endswith(".pdf"):
        file_path = os.path.join(extracted_pages_folder, filename)
        
        pdf_document = fitz.open(file_path)
        
        text_coordinates_page = {}
        for search_string in text_color_map_keys:
            text_instances = pdf_document[0].search_for(search_string)
            text_coordinates_page[search_string] = text_instances
        
        coordinates_by_page[page_number] = text_coordinates_page
```
この部分では、抽出したページごとにハイライトするテキストの座標をリストアップしています。

### 9. 分割したページと重ね合わせる処理

```python
for i in range(split_pages_count):
    extracted_page_path = os.path.join(extracted_pages_folder, f"page_{i}.pdf")
    split_page_path = os.path.join(split_pages_folder, f"page_{i}.pdf")
    
    output_pdf_path = os.path.join(output_folder_path, f"overlay_page_{i}.pdf")
    
    overlay_pdfs(extracted_page_path, split_page_path, output_pdf_path)
```
ここでは、分割されたページと抽出されたページを重ね合わせて新しいPDFファイルを生成しています。

### 結論

このコード全体は、PDFファイル内で特定の情報を視覚的に強調し、必要なページを抽出・マージするための一連のプロセスを実行します。