我有一个reportlab SimpleDocTemplate,并将其作为动态PDF返回。我基于一些Django模型元数据生成它的内容。下面是我的模板设置:
buff = StringIO()
doc = SimpleDocTemplate(buff, pagesize=letter,
rightMargin=72,leftMargin=72,
topMargin=72,bottomMargin=18)
Story = []我可以轻松地将Entry模型中的文本元数据添加到稍后构建的Story列表中:
ptext = '<font size=20>%s</font>' % entry.title.title()
paragraph = Paragraph(ptext, custom_styles["Custom"])
Story.append(paragraph)然后在SimpleDocTemplate上调用build生成要在响应中返回的PDF。
doc.build(Story, onFirstPage=entry_page_template, onLaterPages=entry_page_template)
pdf = buff.getvalue()
resp = HttpResponse(mimetype='application/x-download')
resp['Content-Disposition'] = 'attachment;filename=logbook.pdf'
resp.write(pdf)
return resp模型上的一个元数据字段是文件附件。当这些文件附件是PDF时,我想将它们合并到我正在生成的Story中;IE意味着reportlab“可流动”类型的PDF。
我正在尝试使用pdfrw来做这件事,但是没有任何成功的机会。理想情况下,我只想打电话:
from pdfrw import PdfReader
pdf = pPdfReader(entry.document.file.path)
Story.append(pdf)并将pdf附加到现有的故事列表以包括在最终文档的生成中,如上所述。
有谁有什么想法吗?我尝试了类似的方法,使用pagexobj创建pdf,尝试遵循以下示例:
http://code.google.com/p/pdfrw/source/browse/trunk/examples/rl1/subset.py
from pdfrw.buildxobj import pagexobj
from pdfrw.toreportlab import makerl
pdf = pagexobj(PdfReader(entry.document.file.path))但也没什么好运气。有人能给我解释一下将现有的PDF文件合并到可流动的reportlab中的最佳方法吗?我对这些东西并不在行,几天来我一直在研究pdf-generation。:)任何方向都非常感谢!
发布于 2013-02-07 04:02:01
我刚刚在一个项目中完成了类似的任务。我使用reportlab (开源版本)来生成pdf文件,并使用pyPDF来促进合并。我的要求略有不同,因为我只需要每个附件中的一页,但我相信这可能足够让您了解大意。
from pyPdf import PdfFileReader, PdfFileWriter
def create_merged_pdf(user):
basepath = settings.MEDIA_ROOT + "/"
# following block calls the function that uses reportlab to generate a pdf
coversheet_path = basepath + "%s_%s_cover_%s.pdf" %(user.first_name, user.last_name, datetime.now().strftime("%f"))
create_cover_sheet(coversheet_path, user, user.performancereview_set.all())
# now user the cover sheet and all of the performance reviews to create a merged pdf
merged_path = basepath + "%s_%s_merged_%s.pdf" %(user.first_name, user.last_name, datetime.now().strftime("%f"))
# for merged file result
output = PdfFileWriter()
# for each pdf file to add, open in a PdfFileReader object and add page to output
cover_pdf = PdfFileReader(file( coversheet_path, "rb"))
output.addPage(cover_pdf.getPage(0))
# iterate through attached files and merge. I only needed the first page, YMMV
for review in user.performancereview_set.all():
review_pdf = PdfFileReader(file(review.pdf_file.file.name, "rb"))
output.addPage(review_pdf.getPage(0)) # only first page of attachment
# write out the merged file
outputStream = file(merged_path, "wb")
output.write(outputStream)
outputStream.close()发布于 2014-01-27 09:06:29
我使用了下面的类来解决我的问题。它将PDF作为矢量PDF图像插入。它工作得很好,因为我需要一个目录。可流动的对象允许内置的TOC功能像魔咒一样工作。
Is there a matplotlib flowable for ReportLab?
注意:如果文件中有多个页面,则必须稍微修改类。示例类被设计为只读取PDF的第一页。
发布于 2020-08-27 23:36:27
我知道这个问题有点老了,但我想提供一个使用最新PyPDF2的新解决方案。
您现在可以访问PdfFileMerger,它可以执行您想要的操作,即将PDF附加到现有文件。您甚至可以将它们合并到不同的位置,并选择一个子集或所有页面!
官方文档在这里:https://pythonhosted.org/PyPDF2/PdfFileMerger.html
下面是你问题中的代码示例:
import tempfile
import PyPDF2
from django.core.files import File
# Using a temporary file rather than a buffer in memory is probably better
temp_base = tempfile.TemporaryFile()
temp_final = tempfile.TemporaryFile()
# Create document, add what you want to the story, then build
doc = SimpleDocTemplate(temp_base, pagesize=letter, ...)
...
doc.build(...)
# Now, this is the fancy part. Create merger, add extra pages and save
merger = PyPDF2.PdfFileMerger()
merger.append(temp_base)
# Add any extra document, you can choose a subset of pages and add bookmarks
merger.append(entry.document.file, bookmark='Attachment')
merger.write(temp_final)
# Write the final file in the HTTP response
django_file = File(temp_final)
resp = HttpResponse(django_file, content_type='application/pdf')
resp['Content-Disposition'] = 'attachment;filename=logbook.pdf'
if django_file.size is not None:
resp['Content-Length'] = django_file.size
return resphttps://stackoverflow.com/questions/13368545
复制相似问题