11  iframe

11.1 App.vue内容

高亮关键词一直没有实现

<template>
  <div id="app">
    <!-- 引入ConfigProvider并设置为简体中文 -->
    <ConfigProvider :locale="zhCN">
      <!-- 使用Ant Design Vue的Table组件 -->
      <a-table :columns="columns" :data-source="items" :pagination="pagination" @change="handleTableChange"/>
      

      <!-- 添加输入框组件与按钮组合,并使用Space布局 -->
      <a-space>
        <!-- <a-input 
          v-model:value="searchKeyword" 
          placeholder="请输入搜索关键词" 
          style="width: 300px;" 
        />
        <a-button type="primary" @click="refreshTableData">刷新</a-button> -->

        <a-input-search
          v-model:value="searchKeyword"  
          placeholder="请输入搜索关键词"
          enter-button
          style="width: 300px;"
          @search="refreshTableData"
        />

      </a-space>

      <!-- 其他组件... -->
    </ConfigProvider>
    
  </div>
</template>



<script>
import { Table, Button, Input, InputSearch, Space, ConfigProvider } from 'ant-design-vue';
import zhCN from 'ant-design-vue/lib/locale/zh_CN';
import axios from 'axios';

export default {
  name: 'App',
  components: {
    [Table.name]: Table,
    [Button.name]: Button,
    [Input.name]: Input,
    [InputSearch.name]: InputSearch,
    [Space.name]: Space,
    ConfigProvider,
  },
  data() {
    return {
      zhCN,
      apiUrl: 'https://www.mmphcrc.com/vue/SQLiteHandler.php?table=pdf_pages', // 替换为你的PHP API地址
      columns: [
        { title: '文件名称', dataIndex: 'file_name', sorter: true} , // 添加 defaultSortOrder
        { title: '页码', dataIndex: 'page_number', sorter: true },
        {
          title: '内容',
          dataIndex: 'page_content',
          filters: [
            { text: '附件', value: 'appendix' },
            { text: '模型', value: 'model' },
          ],
          onFilter: (value, record) => {
            if (value === 'appendix') {
              return record.page_content.includes('summplementary');
            } else if (value === 'model') {
              // 这里可以根据实际需求编写个人邮箱的过滤逻辑
              // 以下仅为示例

              return record.page_content.includes('RF');
            }
            return true; // 如果没有匹配到任何值,返回true则不进行过滤
          },
        },
      ],
      items: [],
      pagination: {
        pageSize: 1, // 每页显示条数
        showSizeChanger: true, // 是否可以修改每页显示条数
        pageSizeOptions: ['1', '5', '10', '20'], // 每页显示条数选项
        showTotal: (total) => `共 ${total} 条`, // 显示总条数
      },
      searchKeyword: '', // 新增用于存储搜索关键词的变量
    };
  },
  methods: {
    async refreshTableData() {
      try {
        const searchParam = this.searchKeyword;
        const url = `${this.apiUrl}&search=${encodeURIComponent(searchParam)}`;
        console.log(url)
        const response = await axios.get(url);
        this.items = response.data;
      } catch (error) {
        console.error('Error fetching table data:', error);
      }
    },
    handleTableChange(pagination, filters, sorter) {
      if (sorter.order && sorter.column.dataIndex) {
        this.items.sort((a, b) => {
          let sortFn;
          switch (sorter.column.dataIndex) {
            case 'file_name':
              sortFn = (a, b) => a[sorter.column.dataIndex].localeCompare(b[sorter.column.dataIndex]);
              break;
            case 'page_number':
              sortFn = (a, b) => a[sorter.column.dataIndex] - b[sorter.column.dataIndex];
              break;
            default:
              console.warn('未知列排序:', sorter.column.dataIndex);
              return 0;
          }
          return sorter.order === 'ascend' ? sortFn(a, b) : -sortFn(a, b);
        });
      }
    },
  },
  mounted() {
    // this.refreshTableData(); // 如果需要在页面加载时自动刷新数据,请取消注释这行
  },
};
</script>

<style>
.highlight {
  background-color: yellow;
  font-weight: bold;
}
</style>

11.2 创建模拟数据库的createdb.php文件


<?php
// 创建或打开一个SQLite数据库文件(如果不存在则会创建)
$db = new PDO('sqlite:database.db');

// 如果需要创建表
$db->exec("CREATE TABLE IF NOT EXISTS your_table (
    id INTEGER PRIMARY KEY,
    name TEXT,
    age INTEGER,
    email TEXT
)");

// 插入几行数据
$insertData = [
    ['John Doe', 30, 'john.doe@example.com'],
    ['Jane Smith', 25, 'jane.smith@example.com'],
];

foreach ($insertData as $row) {
    $stmt = $db->prepare("INSERT INTO your_table (name, age, email) VALUES (?, ?, ?)");
    $stmt->execute($row);
}

echo "Data inserted successfully.";

// 关闭数据库连接(不是必需的,但推荐在操作完成后关闭)
$db = null;
?>

11.3 api文件SQLiteHandler.php

<?php
class SQLiteHandler {
    private $db;

    public function __construct($databasePath) {
        $this->db = new PDO("sqlite:$databasePath");
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    public function getItems($query, $params = []) {
        $stmt = $this->db->prepare($query);
        $stmt->execute($params);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    
    
}

// api.php
require_once 'SQLiteHandler.php';

$handler = new SQLiteHandler('pdf_content.db');

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *'); // 允许跨域访问(仅开发环境)

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    $table = isset($_GET['table']) ? $_GET['table'] : '';
    $search = isset($_GET['search']) ? urldecode($_GET['search']) : '';
    if (!empty($table)) {
        try {
            if (!empty($search)) {
                // $search = preg_replace('/\s+/', ' ', $search); // 将连续空格替换为一个空格
                // $keywords = explode(' ', $search);
             
                $search = preg_replace_callback('/"([^"]+)"/', function($matches) {
                return str_replace(' ', '___SPACE___', $matches[0]);
                }, $search);
                
                $search = preg_replace('/\s+/', ' ', $search); // 将连续空格替换为一个空格
                $keywords = explode(' ', $search);
                $keywords = array_map(function($keyword) {
                return trim(str_replace('___SPACE___', ' ', $keyword), '"');
                }, $keywords);
                
                $placeholders = implode(' AND ', array_fill(0, count($keywords), 'page_content LIKE ?'));
                $params = array_map(function($keyword) {
                    return "%$keyword%";
                }, $keywords);
                $query = "SELECT * FROM {$table} WHERE {$placeholders}";
                
                
                // debug用
                // $params = array_values($params); // 重新索引参数数组
                // $finalQuery = $query;
                // foreach ($params as $param) {
                //     $finalQuery = preg_replace('/\?/', $param, $finalQuery, 1);
                // }
                
                // echo $finalQuery;
                
                
                $items = $handler->getItems($query, $params);
                // 高亮关键词
                // foreach ($items as &$item) {
                //     foreach ($keywords as $keyword) {
                //         $item['page_content'] = str_ireplace($keyword, "<mark>$keyword</mark>", $item['page_content']);
                //     }
                // }
                unset($item);
            } else {
                $items = $handler->getItems("SELECT * FROM {$table} LIMIT 20");
            }
            echo json_encode($items);
            // echo json_encode($items, JSON_UNESCAPED_SLASHES);  // 保证html标签的反斜杠不被转义
        } catch (PDOException $e) {
            http_response_code(500);
            echo json_encode(['error' => $e->getMessage()]);
        }
    } else {
        http_response_code(400);
        echo json_encode(['error' => 'Missing table name in the request']);
    }
} else {
    http_response_code(405);
    echo json_encode(['error' => 'Method not allowed']);
}
?>

11.4 创建数据库的python脚本

pdf2sqlite.py

import os
import sqlite3
from argparse import ArgumentParser
import fitz  # PyMuPDF库

def process_pdf_to_sqlite(pdf_dir, db_filename):
    conn = sqlite3.connect(db_filename)
    c = conn.cursor()

    # 创建表结构(如果不存在)
    c.execute('''-- 先检查并删除表(如果存在)
              DROP TABLE IF EXISTS pdf_pages;''')
    c.execute('''
              CREATE TABLE pdf_pages (
                 file_name TEXT,
                 page_number INTEGER,
                 page_content TEXT)''')
    
    page_count = 0
    for filename in os.listdir(pdf_dir):
        if filename.endswith(".pdf"):
            full_path = os.path.join(pdf_dir, filename)

            try:
                with fitz.open(full_path) as doc:

                    for i in range(doc.page_count):
                        page = doc.load_page(i)
                        text = page.get_text("text")  # 获取页面文本内容
                        # print(i)
                        # 将文件名、页码和内容插入数据库
                        c.execute("INSERT INTO pdf_pages VALUES (?, ?, ?)", (filename, i+1, text))
                        page_count += 1

            except Exception as e:
                print(f"处理文件 {filename} 时出错: {e}")

            conn.commit()

    conn.close()
    print(f'导入{page_count}页内容')

if __name__ == "__main__":
    parser = ArgumentParser(description="将指定目录下的所有PDF文件转换为TXT并存储到SQLite数据库中")
    parser.add_argument("db_filename", help="目标SQLite数据库文件名")
    parser.add_argument("pdf_dir", help="包含PDF文件的目录路径")

    args = parser.parse_args()

    process_pdf_to_sqlite(args.pdf_dir, args.db_filename)

使用方法:


python pdf2sqlite.py pdf_content.db pdf_files

# 假设pdf文件放在同目录下的pdf_files文件夹