使用Python在PDF文件中突出显示文本内容并保存截图

4
我有一份PDF文件清单,需要在这些文件的每一页中突出显示特定文本,并为每个文本实例保存一个快照。
到目前为止,我可以突出显示文本并将整个页面作为快照保存。但是,我想找到突出显示文本的位置并拍摄放大的快照,相比于整页快照更加详细。
我相信一定有解决这个问题的方法。由于我是Python的新手,因此无法找到它。 如果有人能帮助我解决这个问题,我会非常感激。
我已经尝试使用PyPDF2和Pymupdf库,但是我无法找到解决方案。 我还尝试通过提供坐标来突出显示,这有效,但找不到将这些坐标作为输出的方法。
[![Sample snapshot from the code[![\]\[1\]][1]][1]][1]

#import PyPDF2
import os
import fitz
from wand.image import Image
import csv
#import re
#from pdf2image import convert_from_path

check = r'C:\Users\Pradyumna.M\Desktop\Pradyumna\Automation\Intel Bytes\Create Source Docs\Sample Check 8 Apr 2019'

dir1 = check + '\\Source Docs\\'
dir2 = check + '\\Output\\'

dir = [dir1, dir2]

for x in dir:
    try:
        os.mkdir(x)
    except FileExistsError:
        print("Directory ", x, " already exists")

### READ PDF FILE
with open('upload1.csv', newline='') as myfile:
    reader = csv.reader(myfile)
    for row in reader:
        rowarray = '; '.join(row)
        src = rowarray.split("; ")
        file = check + '\\' + src[4] + '.pdf'
        print(file)
        #pdfFileObj = open(file,'rb')
        #pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
        #print("Total number of pages: " + str(pdfReader.numPages))
        doc = fitz.open(file)
        print(src[5])
        for i in range(int(src[5])-1, int(src[5])):
            i = int(i)
            page = doc[i]
            print("Processing page: " + str(i))
            text = src[3]
            #SEARCH TEXT
            print("Searching: " + text)
            text_instances = page.searchFor(text)
            for inst in text_instances:
                highlight = page.addHighlightAnnot(inst)
                file1 = check + '\\Output\\' + src[4] + '_output.pdf'
                print(file1)
                doc.save(file1, garbage=4, deflate=True, clean=True)
                ### Screenshot
                with(Image(filename=file1, resolution=150)) as source:
                    images = source.sequence
                    newfilename = check + "\\Source Docs\\" + src[0] + '.jpeg'
                    Image(images[i]).save(filename=newfilename)
                    print("Screenshot of " + src[0] + " saved")

你好,你尝试了什么?你遇到了特定的问题吗? - user10417531
@reportgunner,我已经尝试了上述的库。我的问题是,我无法从PDF文件中提取出高亮文本的坐标。 - Godfrey
请查看以下内容:这个这个 - user10417531
@reportgunner 感谢提供链接,非常感激。 - Godfrey
1个回答

10
"

无法找到将这些坐标作为输出的方法。您可以通过执行以下操作获得坐标:

"
for inst in text_instances:
    print(inst)

inst 是指包含找到的文本左上角和右下角坐标的 fitz.Rect 对象。所有信息都在文档中提供。

我使用以下代码片段成功地高亮显示了文本并保存了裁剪的区域。我使用的是 Python 3.7.1,fitz.version 的输出为 ('1.14.13', '1.14.0', '20190407064320')

import fitz

doc = fitz.open("foo.pdf")
inst_counter = 0
for pi in range(doc.pageCount):
    page = doc[pi]

    text = "hello"
    text_instances = page.searchFor(text)

    five_percent_height = (page.rect.br.y - page.rect.tl.y)*0.05

    for inst in text_instances:
        inst_counter += 1
        highlight = page.addHighlightAnnot(inst)

        # define a suitable cropping box which spans the whole page 
        # and adds padding around the highlighted text
        tl_pt = fitz.Point(page.rect.tl.x, max(page.rect.tl.y, inst.tl.y - five_percent_height))
        br_pt = fitz.Point(page.rect.br.x, min(page.rect.br.y, inst.br.y + five_percent_height))
        hl_clip = fitz.Rect(tl_pt, br_pt)

        zoom_mat = fitz.Matrix(2, 2)
        pix = page.getPixmap(matrix=zoom_mat, clip = hl_clip)
        pix.writePNG(f"pg{pi}-hl{inst_counter}.png")

doc.close()

我在一个带有“hello”的样本pdf上测试了这个脚本: Input image

以下是一些脚本的输出结果: pg2-hello1 pg2-hello5

我从以下文档页面中组合了解决方案:

  • 教程 页面,介绍了该库
  • page.searchFor,了解searchFor方法的返回类型
  • fitz.Rect,了解page.searchFor返回的对象是什么
  • 食谱集合 页面(URL中称为faq),以了解如何裁剪和保存pdf页面的一部分

1
这个解决方案非常完美。同时,感谢分享所有这些链接。它们将非常有用。 - Godfrey
1
我们能否使用相同的方法提取PDF文件中预先高亮显示内容的坐标? - Godfrey
1
我不知道。我使用这个库的唯一时间是为了回答你的问题。查看文档;也许有一些方法可以从页面中提取亮点。 - SpaceMonkey55
1
使用 fitz.Rect 得到了它。谢谢 :) - Godfrey
这是关于使用Python进行PDF高亮显示的Stackoverflow上最佳答案之一,非常感谢@SpaceMonkey55 :-) - Vetrivel PS
有些方法使用shish kabab而不是驼峰式命名:pix._writeIMG(f"pg{pi}-hl{inst_counter}.png", format=1) - Suat Atan PhD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接