我有一个PDF文档,里面有几个超链接,我需要从pdf中提取所有文本。 我使用了http://www.endlesslycurious.com/2012/06/13/scraping-pdf-with-python/中的PDFMiner库和代码来提取文本。但是,它不会提取超链接。
例如,我的文字显示为Check this link out,并附有链接。我能够提取单词Check this link out
,但我真正需要的是超链接本身,而不是单词。
我该怎么做呢?理想情况下,我更喜欢用Python来做,但我也愿意用其他任何语言来做。
我查看了itextsharp
,但还没有使用它。我正在Ubuntu
上运行,并希望得到任何帮助。
答案 0 :(得分:4)
我认为使用PyPDF可以做到这一点。如果要从PDF中提取链接。我不知道我从哪里得到它,但它作为其他东西的一部分存在于我的代码中。希望这会有所帮助:
PDFFile = open('File Location','rb')
PDF = pyPdf.PdfFileReader(PDFFile)
pages = PDF.getNumPages()
key = '/Annots'
uri = '/URI'
ank = '/A'
for page in range(pages):
pageSliced = PDF.getPage(page)
pageObject = pageSliced.getObject()
if pageObject.has_key(key):
ann = pageObject[key]
for a in ann:
u = a.getObject()
if u[ank].has_key(uri):
print u[ank][uri]
我希望这应该给出PDF中的链接。 P.S:我没有广泛尝试过这个。
答案 1 :(得分:2)
这是一个老问题,但似乎很多人都在看它(包括我在尝试回答这个问题时),所以我分享了我想出的答案。作为旁注,学习如何使用Python调试器(pdb)有很多帮助,因此您可以即时检查这些对象。
可以使用PDFMiner获取超链接。复杂性(就像关于PDF这么多),链接注释和链接文本之间确实没有关系,除了它们都位于页面的同一区域。
以下是我用于获取PDFPage链接的代码
annotationList = []
if page.annots:
for annotation in page.annots.resolve():
annotationDict = annotation.resolve()
if str(annotationDict["Subtype"]) != "/Link":
# Skip over any annotations that are not links
continue
position = annotationDict["Rect"]
uriDict = annotationDict["A"].resolve()
# This has always been true so far.
assert str(uriDict["S"]) == "/URI"
# Some of my URI's have spaces.
uri = uriDict["URI"].replace(" ", "%20")
annotationList.append((position, uri))
然后我定义了一个函数:
def getOverlappingLink(annotationList, element):
for (x0, y0, x1, y1), url in annotationList:
if x0 > element.x1 or element.x0 > x1:
continue
if y0 > element.y1 or element.y0 > y1:
continue
return url
else:
return None
我用来搜索我之前在页面上找到的annotationList,看看是否有任何超链接占用了与我在页面上检查的LTTextBoxHorizontal相同的区域。
就我而言,由于PDFMiner在文本框中整合了太多文本,因此我浏览了每个文本框的_objs属性,并查看了所有LTTextLineHorizontal实例,以查看它们是否与任何注释位置重叠。 / p>
答案 2 :(得分:1)
Ashwin的答案的稍作修改的版本:
import PyPDF2
PDFFile = open("file.pdf",'rb')
PDF = PyPDF2.PdfFileReader(PDFFile)
pages = PDF.getNumPages()
key = '/Annots'
uri = '/URI'
ank = '/A'
for page in range(pages):
print("Current Page: {}".format(page))
pageSliced = PDF.getPage(page)
pageObject = pageSliced.getObject()
if key in pageObject.keys():
ann = pageObject[key]
for a in ann:
u = a.getObject()
if uri in u[ank].keys():
print(u[ank][uri])
答案 3 :(得分:0)
超链接实际上是一个注释,因此您需要处理注释而不是“提取文本”。我怀疑你是否需要使用诸如itextsharp,MuPDF或Ghostscript之类的库,如果你真的很绝望(并且在PostScript中编程很舒服)。
我认为处理注释类型LNK的注释非常容易。
答案 4 :(得分:0)
这是一个以我能找到的最简单的方法创建URL列表的版本:
import PyPDF2
pdf = PyPDF2.PdfFileReader('filename.pdf')
urls = []
for page in range(pdf.numPages):
pdfPage = pdf.getPage(page)
try:
for item in (pdfPage['/Annots']):
urls.append(item['/A']['/URI'])
except KeyError:
pass
答案 5 :(得分:0)
import pikepdf
pdf_file = pikepdf.Pdf.open("pdf.pdf")
urls = []
for page in pdf_file.pages:
for annots in page.get("/Annots"):
url=annots.get("/A").get("/URI")
if url is not None:
urls.append(url)
urls.append(" ; ")
print(urls)
<块引用>
您将获得给定 PDF 中以分号分隔的链接列表