pdf区域信息提取改善

PDF区域文本提取工具_小小明-代码实体的博客-优快云博客_有直接从pdf固定区域中提取文字的程序吗  我之前看过一篇博客,详细介绍了批量pdf区域信息提取的代码,博客里面有软件下载地址。

使用了一段时间后有点小问题需要修改一下,我把我改善的地方发表一下。

首先可能是库更新了pageCount需要修改为page_count,这时候软件已经能跑起来了。

原来pdf划区域时只能从左上角到右下角,从左下角到右上角就不行,修改一点代码,怎么划区域都好使了。下面把修改区域的代码放出来,修改了两个def模块的代码。

    def OnLeftButtonEvent(self, event):
        if event.LeftDown():
            self.x, self.y = event.GetPosition()
            self.rects.append([self.x, self.y, 0, 0])
        elif event.Dragging():
            x, y = event.GetPosition()
            self.rects[-1][2] = x - self.x
            self.rects[-1][3] = y - self.y
            self.DoDrawing(-1)
        elif event.LeftUp():
            print(self.rects)
            if -5 < self.rects[-1][2] < 5 or -5 < self.rects[-1][3] < 5:
                self.rects.pop()
            else:
                self.parent.SetTitle(self.path + "|" + self.extract_pdf_text())
    def extract_pdf_text(self, page=None, rect=None):
        if page is None:
            page = self.pdfDoc[self.i]
        if rect is None:
            rect = self.rects[-1]
        a, b, c, d = rect
        min_x = min(a, a + c)
        max_x = max(a, a + c)
        min_y = min(b, b + d)
        max_y = max(b, b + d)
        clip = fitz.Rect(min_x, min_y, max_x , max_y)
        text = page.get_text(clip=clip).strip()
        return text

### 使用 pdfplumber 提取 PDF 内容为空的解决方案 当使用 `pdfplumber` 提取 PDF 文本时,可能会遇到某些页面返回空字符串的情况。这通常是因为这些页面可能不包含可提取的纯文本数据,或者它们是以图像形式存储的文本[^3]。 #### 可能的原因分析 1. **PDF 页面为扫描件或图片型文档** 如果 PDF 是通过扫描仪生成的,则其内容实际上是嵌入到 PDF 中的一张或多张图片,而不是实际的文本字符。这种情况下,即使使用 `pdfplumber.extract_text()` 方法也不会获取任何有效文本[^4]。 2. **特殊字体编码问题** 某些 PDF 文件会使用自定义字库来表示文字,在尝试解析这类文件时可能导致无法识别特定字符集,从而使得最终提取的结果为空[^1]。 3. **布局复杂度高** 对于结构复杂的 PDF (比如含有大量图表、线条或者其他非标准格式),单纯依赖 `.extract_text()` 函数难以捕捉全部信息。 --- #### 解决方法 ##### 方法一:检查是否为图片型 PDF 并应用 OCR 技术 如果确认目标 PDF 属于上述提到的第一种情况——即由扫描形成的 PDF 或者完全基于图形构建而成,则需借助光学字符识别(OCR)工具如 Pytesseract 来转换图像中的视觉内容成为机器可读的文字串[^2]: ```python import pdfplumber from PIL import Image import pytesseract def extract_image_pdf(file_path, page_num): with pdfplumber.open(file_path) as pdf: first_page = pdf.pages[page_num] im = first_page.to_image(resolution=150).original # 转换当前页至PIL.Image对象 text = pytesseract.image_to_string(im) return text result = extract_image_pdf('your_file.pdf', 0) print(result) ``` 此处利用了 `pdfplumber.Page.to_image().original` 将指定编号的单页渲染成 Pillow 库兼容的形式以便后续传递给 Tesseract 进行处理。 ##### 方法二:调整参数设置优化常规文本抽取效果 对于那些并非纯粹影像构成却依旧存在部分区域丢失现象的标准电子档来说,可以通过调节一些选项改善状况: - 设置更精确的对象定位范围; - 自定义分隔符用于连接断开词语片段; 下面是一个改进版的例子展示了如何精细化控制各个要素位置以及合并零散单元格内的条目形成连贯叙述句段: ```python import pdfplumber def advanced_extraction(pdf_path): result_texts = [] with pdfplumber.open(pdf_path) as pdf: for i, pg in enumerate(pdf.pages): words = pg.extract_words() line_dict = {} for word in words: top = round(word['top'], 1) if not line_dict.get(top): line_dict[top] = [] line_dict[top].append((word["text"], word["x0"])) sorted_lines = list(line_dict.keys()) sorted_lines.sort() full_line = "" prev_x = None for ln in sorted_lines: items = [(item[1], item[0]) for item in line_dict[ln]] ordered_items = sorted(items) for idx, itm in enumerate(ordered_items): curr_word = itm[1] if prev_x is not None and abs(itm[0]-prev_x)>8: full_line += ' ' full_line += f"{curr_word} " prev_x = itm[0]+len(curr_word)*7 result_texts.append(full_line.strip()) return "\n".join(result_texts) output_txt = advanced_extraction("input_doc.pdf") with open("output.txt", "w") as file_handler: file_handler.write(output_txt) ``` 此脚本不仅能够克服简单模式下遗漏细节的问题,而且还能妥善管理跨列分布的数据项使其自然衔接在一起呈现完整的描述性语句^. --- ### 注意事项 尽管以上两种策略分别针对不同类型的难题提供了有效的应对措施,但在实际操作过程中仍有可能碰到其他意想不到的情形。因此建议始终保留原始输入材料副本以防万一需要回溯验证所得成果的真实性与准确性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国服小闲鱼请战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值