-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpdf.py
More file actions
86 lines (75 loc) · 2.79 KB
/
pdf.py
File metadata and controls
86 lines (75 loc) · 2.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
from PyPDF2 import PdfFileReader, PdfFileWriter
import subprocess
import os
import io
from tempfile import mkstemp
class PngPage(object):
"""
Класс оборачивающий работу с PNG страницами PDF файла
"""
def __init__(self, data, page_num):
self.data = data
self.page_num = page_num
def get_data(self):
"""
Возвращает бинарное содержимое страницы
"""
return self.data
def get_page_num(self):
"""
Возвращает номер страницы
"""
return self.page_num
class PdfDoc(object):
"""
Класс оборачивающий работу PDF файлом
"""
def __init__(self, filename, data):
self.filename = filename
self.data = data
def split(self):
"""
Разделяет PDF файл на страницы
"""
# TODO: переделать на использование средств Python
result = []
# Генерируем два вспомогательных файла
pdf_temp_fd, pdf_temp_path = mkstemp(suffix=".pdf")
png_temp_fd, png_temp_path = mkstemp(suffix=".png")
# Открываем "читальщик" pdf
original_pdf_bytes = io.BytesIO()
original_pdf_bytes.write(self.data)
original_pdf_bytes.seek(0)
src_pdf = PdfFileReader(original_pdf_bytes)
page_count = src_pdf.numPages
for current_page in range(0, page_count):
# Записываем постранично pdf
dst_pdf = PdfFileWriter()
dst_pdf.addPage(src_pdf.getPage(current_page))
f_pdf_write = open(pdf_temp_path, 'wb')
dst_pdf.write(f_pdf_write)
f_pdf_write.close()
# Конвертируем pdf в png
subprocess.run(["convert", pdf_temp_path, png_temp_path])
f_png_read = open(png_temp_path, 'rb')
# Читаем полученный PNG файл
png_data = f_png_read.read()
f_png_read.close()
page = PngPage(png_data, current_page + 1) # Чтобы у страниц нумерация была не с нуля
result.append(page)
# Удаляем временные файлы
os.close(pdf_temp_fd)
os.close(png_temp_fd)
os.remove(pdf_temp_path)
os.remove(png_temp_path)
return result
def get_data(self):
"""
Возвращает бинарное содержимое файла
"""
return self.data
def get_filename(self):
"""
Возвращает бинарное название файла
"""
return self.filename