Я использую Reportlab для создания PDF-файлов. Я создаю два PDF-файла, которые хочу объединить после их создания. Reportlab предоставляет способ сохранения pycanvas (source) (который в основном является моим pdf-файлом в памяти) в виде файла python и вызовом метода doIt(filename) для этого python-файла воссоздает pdf-файл. Это здорово, так как вы можете объединить два PDF-файла на основе исходного кода и создать один объединенный PDF-файл.
Это делается так:
from reportlab.pdfgen import canvas, pycanvas
#create your canvas
p = pycanvas.Canvas(buffer,pagesize=PAGESIZE)
#...instantiate your pdf...
# after that, close the PDF object cleanly.
p.showPage()
p.save()
#now create the string equivalent of your canvas
source_code_equiv = str(p)
source_code_equiv2 = str(p)
#merge the two files on str. basis
#not shown how it is exactly done, to make it more easy to read the source
#actually one just have to take the middle part of source_code_equiv2 and add it into source_code_equiv
final_pdf = source_code_equiv_part1 + source_code_equiv2_center_part + source_code_equiv_part2
#write the source-code equivalent of the pdf
open("n2.py","w").write(final_pdf)
from myproject import n2
p = n2.doIt(buffer)
# Get the value of the StringIO buffer and write it to the response.
pdf = buffer.getvalue()
buffer.close()
response.write(pdf)
return response
Это прекрасно работает, но я хочу пропустить шаг сохранения n2.py на диск. Таким образом, я ищу способ создать из строки final_pdf соответствующий класс python и использовать его непосредственно в источнике. Это возможно?
Это должно работать как-то так..
n2 = instantiate_python_class_from_source(final_pdf)
p = n2.doIt(buffer)
Причина этого в основном в том, что на самом деле нет необходимости сохранять исходный код на диск, а во-вторых, что это абсолютно не сохранение потока. Я мог бы назвать созданный файл во время выполнения, но тогда я не знаю, что импортировать!? Если нет способа предотвратить сохранение файла, есть ли способ определить импорт на основе имени файла, которое определяется во время выполнения!?
Можно спросить, почему я заранее не создаю один pdf, но это невозможно, так как они идут из разных приложений.