我想编写一个读取PDF的小脚本(它将在无头Linux服务器上运行),突出显示与我传递的字符串数组中的任何内容相匹配的文本,然后保存修改后的PDF。我想我最终会使用类似python bindings to poppler的东西,但不幸的是,接近零的文档,我有python旁边的零经验。阅读,突出显示,以编程方式保存PDF
如果有人能指点我一个教程,例子或一些有用的文档,让我开始它将不胜感激!
我想编写一个读取PDF的小脚本(它将在无头Linux服务器上运行),突出显示与我传递的字符串数组中的任何内容相匹配的文本,然后保存修改后的PDF。我想我最终会使用类似python bindings to poppler的东西,但不幸的是,接近零的文档,我有python旁边的零经验。阅读,突出显示,以编程方式保存PDF
如果有人能指点我一个教程,例子或一些有用的文档,让我开始它将不胜感激!
PDFlib具有Python绑定并支持这些操作。如果您想打开PDF,您将需要PDI。 http://www.pdflib.com/products/pdflib-family/pdflib-pdi/和TET。
不幸的是,它是一种商业产品。过去我在制作过程中使用过这个库,效果很好。绑定功能非常强大,而不是Python。我已经看到一些尝试使它们变得更加Pythonic:https://github.com/alexhayes/pythonic-pdflib您将要使用:open_pdi_document()。
这听起来像你会希望做一些搜索高亮:
http://www.pdflib.com/tet-cookbook/tet-and-pdflib/highlight-search-terms/
是的,这是可能的pdfminer(pip install pdfminer.six
)和PyPDF2
的组合。
首先找到坐标(例如像this)。然后突出显示:
#!/usr/bin/env python
"""Create sample highlight in a PDF file."""
from PyPDF2 import PdfFileWriter, PdfFileReader
from PyPDF2.generic import (
DictionaryObject,
NumberObject,
FloatObject,
NameObject,
TextStringObject,
ArrayObject
)
def create_highlight(x1, y1, x2, y2, meta, color=[0, 1, 0]):
"""
Create a highlight for a PDF.
Parameters
----------
x1, y1 : float
bottom left corner
x2, y2 : float
top right corner
meta : dict
keys are "author" and "contents"
color : iterable
Three elements, (r,g,b)
"""
new_highlight = DictionaryObject()
new_highlight.update({
NameObject("/F"): NumberObject(4),
NameObject("/Type"): NameObject("/Annot"),
NameObject("/Subtype"): NameObject("/Highlight"),
NameObject("/T"): TextStringObject(meta["author"]),
NameObject("/Contents"): TextStringObject(meta["contents"]),
NameObject("/C"): ArrayObject([FloatObject(c) for c in color]),
NameObject("/Rect"): ArrayObject([
FloatObject(x1),
FloatObject(y1),
FloatObject(x2),
FloatObject(y2)
]),
NameObject("/QuadPoints"): ArrayObject([
FloatObject(x1),
FloatObject(y2),
FloatObject(x2),
FloatObject(y2),
FloatObject(x1),
FloatObject(y1),
FloatObject(x2),
FloatObject(y1)
]),
})
return new_highlight
def add_highlight_to_page(highlight, page, output):
"""
Add a highlight to a PDF page.
Parameters
----------
highlight : Highlight object
page : PDF page object
output : PdfFileWriter object
"""
highlight_ref = output._addObject(highlight)
if "/Annots" in page:
page[NameObject("/Annots")].append(highlight_ref)
else:
page[NameObject("/Annots")] = ArrayObject([highlight_ref])
def main():
pdf_input = PdfFileReader(open("samples/test3.pdf", "rb"))
pdf_output = PdfFileWriter()
page1 = pdf_input.getPage(0)
highlight = create_highlight(89.9206, 573.1283, 376.849, 591.3563, {
"author": "John Doe",
"contents": "Lorem ipsum"
})
add_highlight_to_page(highlight, page1, pdf_output)
pdf_output.addPage(page1)
output_stream = open("output.pdf", "wb")
pdf_output.write(output_stream)
if __name__ == '__main__':
main()
这通常不是100%防呆,因为任何PDF编译器 - 即使是老可信赖的人喜欢Pdftex提供可能借鉴PDF内联每哪个地方...你确定你的PDF可以以这种方式阅读? – Gleno
我看到它的方式,在Evince(或大多数其他PDF阅读器)中的'find'函数基本上是我想要的 - 它突出显示匹配的文本,基本上在任何PDF中。如果它可以在屏幕上呈现这种突出显示,为什么不把它呈现给文件? – Jake
这只是一个有点棘手,因为PDF通常不提供文本流。它更像一个图像 - 文本可以出现在任何地方。通常它对读者来说看起来很不错,但内部是一团糟。换句话说 - 通常情况下,文本理由是通过分解文本并将内联放在内部以使其看起来合理。无论如何,当Evince强调它要么很聪明时,你的PDF表现得很好,或者你很幸运,因为那个特定的字符串作为PDF中的一个连续实体存在。无论如何,看看http://itextpdf.com/这是最好的免费图书馆。 – Gleno