Vâng, đó là có thể với sự kết hợp của pdfminer (pip install pdfminer.six
) và PyPDF2
.
Trước tiên, hãy tìm tọa độ (ví dụ như this). Sau đó tô sáng nó:
#!/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()
Điều này thường không phải là 100% chống lừa đảo, như bất kỳ trình biên dịch PDF nào - thậm chí một trình cũ và đáng tin cậy như pdftex có thể vẽ pdf inline ở mọi nơi ... Bạn có chắc chắn rằng các tệp PDF của mình có thể được đọc theo cách như vậy? – Gleno
Cách tôi nhìn thấy nó, chức năng 'tìm' trong Evince (hoặc hầu hết các trình đọc PDF khác, cho rằng vấn đề) về cơ bản những gì tôi muốn - nó làm nổi bật văn bản phù hợp, về cơ bản bất kỳ PDF nào. Nếu nó có thể làm nổi bật như vậy làm nổi bật màn hình, tại sao không hiển thị nó ra một tập tin? – Jake
Nó chỉ là một chút khó khăn, bởi vì PDF thường không cung cấp dòng văn bản. Nó giống như một hình ảnh - văn bản có thể xuất hiện ở bất cứ đâu. Thông thường nó có vẻ tốt cho người đọc, nhưng nội bộ là một mớ hỗn độn. Để wit - thường là văn bản justification đạt được bằng cách phá vỡ văn bản và chỉ cần đặt inlines để nó xuất hiện hợp lý. Dù sao, khi Evince làm nổi bật một cái gì đó hoặc là được thông minh, PDF của bạn là tốt cư xử hoặc bạn chỉ nhận được may mắn vì chuỗi cụ thể cư trú như là một thực thể liên tục trong PDF. Dù sao, có một cái nhìn tại http://itextpdf.com/ đó là thư viện miễn phí tốt nhất hiện có. – Gleno