はい、それは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()
これは、任意のPDFコンパイラとして、一般的ではない100%のフールプルーフである - pdfTeXのようにも古いと信頼の一つは、あなたのPDFファイルができることを確認しています...すべてのどの場所のPDFインラインを引くかもしれませんそんなやり方で読まれますか? – Gleno
Evince(または他のほとんどのPDFリーダー)の 'find'関数は、基本的にはどんなPDFでも一致するテキストを強調表示します。このような強調表示を画面に表示できる場合は、ファイルにレンダリングしてみませんか? – Jake
PDFは一般的にテキストフローを提供しないので、ややこしいことです。それはイメージのようなものです。どこにでもテキストを表示できます。しばしば、読者にはよく見えますが、内部的には混乱しています。気にして - テキストを正当化するには、テキストを分割してインラインを配置するだけで、テキストの正当化が達成されることがよくあります。とにかく、Evinceが何かをハイライトすると、それは巧妙であるか、PDFが正常に動作しているか、その特定の文字列がPDF内の連続したエンティティとして常駐しているだけなので幸運になります。とにかく、http://itextpdf.com/を見てください。そこは、最高の無料のライブラリです。 – Gleno