Guide de réglage ChatGPT : extraire les titres du PDF et les enregistrer

1. Veuillez utiliser Python pour écrire un code, utilisez le package pymupdf pour extraire le titre du pdf et enregistrez le nom du titre et le numéro de page.

Je n'ai ajouté aucun indice de réponse pour voir comment GPT réagit. Il faut savoir que le PDF ne contient aucune information sémantique et que tous les titres ou textes ne sont que des zones de texte.

D'accord, voici un exemple de code qui utilise le package pymupdf pour extraire les titres d'un pdf et enregistrer le nom du titre et le numéro de page :

import fitz

def extract_titles(pdf_path):
    doc = fitz.open(pdf_path)
    titles = []

    for page in doc:
        blocks = page.get_text("dict")["blocks"]
        
        for block in blocks:
            if block["type"] == 1 and block["bbox"][3] < 100:
                title = block["text"]
                page_num = page.number + 1
                titles.append({
    
    "title": title, "page": page_num})

    return titles

pdf_path = "example.pdf"
titles = extract_titles(pdf_path)

for title in titles:
    print("Title:", title["title"])
    print("Page:", title["page"])
    print()


Il y avait une erreur, page.getTextça devrait l'être page.get_text, je l'ai corrigé.

Cette logique est complètement fausse. J'ai essayé le texte PDF suivant que j'avais sous la main (Three Eyes Anthology.pdf). La doc[1]première ligne de la deuxième page est le titre. Voyez si vous pouvez l'extraire

pdf_path = r"d:/docs/wealth-books-2023/权谋/三眼文集.pdf"
doc = fitz.open(pdf_path)
print(doc[1].get_text("dict")['blocks'][0])
'''
{'number': 0,
 'type': 0,
 'bbox': (48.0, 52.383140563964844, 531.0696411132812, 96.42223358154297),
 'lines': [{'spans': [{'size': 16.440000534057617,
     'flags': 4,
     'font': 'MicrosoftYaHeiUI',
     'color': 0,
     'ascender': 1.015625,
     'descender': -0.25439453125,
     'text': '赚钱的本质套路一共就3个:底层收智商税、中层找接盘侠、上层',
     'origin': (48.0, 69.08001708984375),
     'bbox': (48.0,
      52.383140563964844,
      531.0696411132812,
      73.26226043701172)}],
   'wmode': 0,
   'dir': (1.0, 0.0),
   'bbox': (48.0, 52.383140563964844, 531.0696411132812, 73.26226043701172)},
  {'spans': [{'size': 16.440000534057617,
     'flags': 4,
     'font': 'MicrosoftYaHeiUI',
     'color': 0,
     'ascender': 1.015625,
     'descender': -0.25439453125,
     'text': '玩金融!(完整版)',
     'origin': (48.0, 92.239990234375),
     'bbox': (48.0, 75.5431137084961, 199.65902709960938, 96.42223358154297)}],
   'wmode': 0,
   'dir': (1.0, 0.0),
   'bbox': (48.0, 75.5431137084961, 199.65902709960938, 96.42223358154297)}]}
'''

Ce bloc de texte est bien un titre, mais typeil n'est pas 1 et ne peut pas du tout être extrait.

2. Veuillez utiliser Python pour écrire un morceau de code, utilisez le package pymupdf pour extraire le titre du PDF, enregistrez le nom du titre et le numéro de page, veillez à ne pas juger en fonction du type de bloc de texte, mais en fonction de sa taille. .

Mais on sait que la taille du titre est évidemment différente du texte principal. Par exemple, la taille du texte principal est de 12 et le titre est de 16, alors OK, on ​​guide GPT pour les distinguer en termes de taille.

Vous pouvez utiliser le code suivant pour extraire le titre et le numéro de page d'un PDF à l'aide du package pymupdf et l'enregistrer dans une liste :

import fitz

def extract_titles(pdf_path):
    doc = fitz.open(pdf_path)
    titles = []

    for page_num in range(len(doc)):
        page = doc.load_page(page_num)
        blocks = page.get_text("dict", flags=11)["blocks"]

        for block in blocks:
            if block["type"] == 1 and block["bbox"][3] < 100:
                title = block["text"].strip()
                titles.append({
    
    "title": title, "page": page_num})

    return titles

pdf_path = "your_pdf_path.pdf"
titles = extract_titles(pdf_path)

for title in titles:
    print(f"Title: {
      
      title['title']}, Page: {
      
      title['page']}")

Veuillez remplacer « your_pdf_path.pdf » dans le code par le chemin d'accès au PDF dont vous souhaitez extraire les titres. Le code utilise le package pymupdf pour ouvrir le fichier PDF et parcourir chaque page, puis vérifier le type et la taille de chaque bloc de texte. Si le bloc de texte est de type 1 (c'est-à-dire titre) et que la hauteur de sa boîte englobante est inférieure à 100, le titre et le numéro de page seront extraits et ajoutés à la liste de titres. Enfin, imprimez tous les titres et numéros de page extraits.

Il semble qu'il soit toujours inchangé et se distingue toujours en fonction de la hauteur et du type de zone de texte.

3. Veuillez utiliser Python pour écrire un morceau de code et utiliser le package pymupdf pour extraire les titres du PDF. La méthode générale consiste à obtenir chaque zone de texte de chaque page. Si la taille de la police dépasse un certain multiple de la moyenne, c'est jugé comme un titre, puis le nom du titre et la page sont enregistrés.

Vous pouvez utiliser le package pymupdf pour extraire les titres des fichiers PDF. Voici un exemple de code qui détermine le titre en fonction de la taille de la police et enregistre le nom du titre et le numéro de page :

import fitz

def extract_titles_from_pdf(file_path, threshold=1.5):
    doc = fitz.open(file_path)
    titles = []

    for page in doc:
        text_blocks = page.getTextBlocks()
        font_sizes = [block[1] for block in text_blocks]
        avg_font_size = sum(font_sizes) / len(font_sizes)

        for block in text_blocks:
            font_size = block[1]
            text = block[4]

            if font_size > avg_font_size * threshold:
                titles.append((text, page.number))

    return titles

# 调用示例
pdf_path = "example.pdf"
titles = extract_titles_from_pdf(pdf_path)
for title, page_num in titles:
    print(f"标题: {
      
      title}\t页数: {
      
      page_num}")

Il y a une erreur dans ce code, c'est-à-dire que blockles quatre premières valeurs sont les quatre composantes du rectangle et non la taille. Cependant, si cette idée est modifiée, elle devrait pouvoir être utilisée.

4. Code modifié

'''
block: {'number': 1,
  'type': 0,
  'bbox': (158.25, 569.15625, 446.25, 663.375),
  'lines': [{'spans': [{'size': 72.0,
      'flags': 0,
      'font': 'SimSun',
      'color': 16776960,
      'ascender': 1.04296875,
      'descender': -0.265625,
      'text': '三眼文集',
      'origin': (158.25, 644.25),
      'bbox': (158.25, 569.15625, 446.25, 663.375)}],
    'wmode': 0,
    'dir': (1.0, 0.0),
    'bbox': (158.25, 569.15625, 446.25, 663.375)}]}
'''


def extract_titles_from_pdf(file_path, thres=1.2):
    doc = fitz.open(file_path)
    titles = []

    for i, page in enumerate(doc):
        blocks = [
            block for block in page.get_text("dict")["blocks"]
            if block['type'] == 0
        ]
        sizes = [
            span['size'] 
            for block in blocks
            for line in block['lines']
            for span in line['spans']
        ]
        avg_size = sum(sizes) / (len(sizes) + 1e-9)

        page_titles = [
            (span['text'], i) 
            for block in blocks
            for line in block['lines']
            for span in line['spans']
            if span['size'] > avg_size * thres
        ]
        titles += page_titles

    return titles

OK, alors appelle :

res = extract_titles_from_pdf(pdf_path, 1.2)
print(res)
'''
[('赚钱的本质套路一共就3个:底层收智商税、中层找接盘侠、上层', 1),
 ('玩金融!(完整版)', 1),
 ('钱就是债!——金融家的秘密,老百姓的盲点!明白这个才能不被', 8),
 ('收割', 8),
 ('穷人才想赚快钱!教人致富多为骗局!想变富要明白一个逻辑:分', 11),
 ('配!', 11),
 ('历史观比财经观更重要!经济是政治的延伸,而今天是昨日的推', 14),
 ('演!', 14),
 ('大钱要靠分配!不是卖苦力赚的!人生是无数个局,看局方能破局', 17),
 ('为何啥都不好干了?为何经济放缓了?本质在于这一群体快被抽', 21),
 ('干!', 21),
 ('过去高增长的本质是什么?', 21),
 ...]
'''

OK Achèvement initial.

Je suppose que tu aimes

Origine blog.csdn.net/wizardforcel/article/details/133465513
conseillé
Classement