我想編寫一個讀取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