- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想将 matplotlib 图表直接嵌入到 ReportLab 生成的 PDF 中——即不先保存为 PNG,然后将 PNG 嵌入到 PDF 中(我想我会得到更好质量的输出)。
有谁知道 ReportLab 是否有可流动的 matplotlib?
谢谢
最佳答案
这是一个使用 pdfrw 的解决方案:
#!/usr/bin/env python
# encoding: utf-8
"""matplotlib_example.py
An simple example of how to insert matplotlib generated figures
into a ReportLab platypus document.
"""
import matplotlib
matplotlib.use('PDF')
import matplotlib.pyplot as plt
import cStringIO
from pdfrw import PdfReader
from pdfrw.buildxobj import pagexobj
from pdfrw.toreportlab import makerl
from reportlab.platypus import Flowable
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.rl_config import defaultPageSize
from reportlab.lib.units import inch
PAGE_HEIGHT=defaultPageSize[1]; PAGE_WIDTH=defaultPageSize[0]
styles = getSampleStyleSheet()
class PdfImage(Flowable):
"""PdfImage wraps the first page from a PDF file as a Flowable
which can be included into a ReportLab Platypus document.
Based on the vectorpdf extension in rst2pdf (http://code.google.com/p/rst2pdf/)"""
def __init__(self, filename_or_object, width=None, height=None, kind='direct'):
from reportlab.lib.units import inch
# If using StringIO buffer, set pointer to begining
if hasattr(filename_or_object, 'read'):
filename_or_object.seek(0)
page = PdfReader(filename_or_object, decompress=False).pages[0]
self.xobj = pagexobj(page)
self.imageWidth = width
self.imageHeight = height
x1, y1, x2, y2 = self.xobj.BBox
self._w, self._h = x2 - x1, y2 - y1
if not self.imageWidth:
self.imageWidth = self._w
if not self.imageHeight:
self.imageHeight = self._h
self.__ratio = float(self.imageWidth)/self.imageHeight
if kind in ['direct','absolute'] or width==None or height==None:
self.drawWidth = width or self.imageWidth
self.drawHeight = height or self.imageHeight
elif kind in ['bound','proportional']:
factor = min(float(width)/self._w,float(height)/self._h)
self.drawWidth = self._w*factor
self.drawHeight = self._h*factor
def wrap(self, aW, aH):
return self.drawWidth, self.drawHeight
def drawOn(self, canv, x, y, _sW=0):
if _sW > 0 and hasattr(self, 'hAlign'):
a = self.hAlign
if a in ('CENTER', 'CENTRE', TA_CENTER):
x += 0.5*_sW
elif a in ('RIGHT', TA_RIGHT):
x += _sW
elif a not in ('LEFT', TA_LEFT):
raise ValueError("Bad hAlign value " + str(a))
xobj = self.xobj
xobj_name = makerl(canv._doc, xobj)
xscale = self.drawWidth/self._w
yscale = self.drawHeight/self._h
x -= xobj.BBox[0] * xscale
y -= xobj.BBox[1] * yscale
canv.saveState()
canv.translate(x, y)
canv.scale(xscale, yscale)
canv.doForm(xobj_name)
canv.restoreState()
Title = "Hello world"
pageinfo = "platypus example"
def myFirstPage(canvas, doc):
canvas.saveState()
canvas.setFont('Times-Bold',16)
canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-108, Title)
canvas.setFont('Times-Roman',9)
canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo)
canvas.restoreState()
def myLaterPages(canvas, doc):
canvas.saveState()
canvas.setFont('Times-Roman',9)
canvas.drawString(inch, 0.75 * inch, "Page %d %s" % (doc.page, pageinfo))
canvas.restoreState()
def go():
fig = plt.figure(figsize=(4, 3))
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
imgdata = cStringIO.StringIO()
fig.savefig(imgdata,format='PDF')
doc = SimpleDocTemplate("document.pdf")
Story = [Spacer(1,2*inch)]
style = styles["Normal"]
for i in range(5):
bogustext = ("This is Paragraph number %s. " % i) *20
p = Paragraph(bogustext, style)
Story.append(p)
Story.append(Spacer(1,0.2*inch))
pi = PdfImage(imgdata)
Story.append(pi)
Story.append(Spacer(1,0.2*inch))
doc.build(Story, onFirstPage=myFirstPage, onLaterPages=myLaterPages)
if __name__ == '__main__':
go()
关于python - ReportLab 有可流动的 matplotlib 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4690585/
目前我找到的最佳解决方案是: http://jsfiddle.net/kizu/UUzE9/ 但事实并非如此。你看,我有三列;其中两个需要避免明确调整大小。好吧,第二个确实需要调整大小;但不完全是。
假设我们有两种类型和它们的联合: type A = {tag: 'a'}; type B = {tag: 'b'}; type U = A | B; 以及返回 A 或 B 的函数,具体取决于提供的标签
我有四个 div。 div 2 是 div 1 高度的一半,div 3 & 4 是 div 2 高度的一半。 在大显示器上 div 的位置很好: ---------------- ----------
要使用 display: block 居中元素,人们使用 margins: auto。如果我将 max-width 设置为需要居中的子项,并且它周围有足够的空间,它将根据需要尽可能多地流动到 max-
我试图获得的效果是在 bootstrap 中使用列从左到右文本流动的位置。在第一个部分的第十二列之后,我想换行,希望代码能让它更清晰。
我知道固定列可以在 X 轴和 Y 轴上溢出'。我还在某处读到,如果您将其中一个轴设置为自动/滚动,则另一组将继承前一个轴的行为,除非它被设置为 hidden。 我的困境是:我有一个固定的列
我基本上想要这个: ----------------------------------------------------------------- |
我正在尝试构建一个由三个主要 block 组成的移动就绪设计,广告 block 、内容 block 和侧边栏 block (加上页眉和页脚,但这些对于这个问题并不重要)。 想法是让广告和侧边栏具有固定
我正在关注这个guide上传照片。代码工作正常,但 flowtype 会告诉我有一个错误:调用方法“append”。不能在交集类型交集的任何成员上调用函数 出现错误后,流程不会传递该代码是有道理的,因
通过研究引用应用程序和阅读手册,我对 Spring WebFlow 2.1 有了第一印象。在进一步讨论之前,我想问一下对这个社区的印象。 实际上,我计划我的网站只包含一个网页。其他所有内容(登录/注销
我不确定为什么,但我得到这个文本显示/流动在 之外标签。我认为这与 float 有关,但我已经尝试了所有我知道的解决方案来修复它,但它们都没有奏效。 这是 jsfiddle(我在 Safari 中)
典型的 ISP 设置。一台服务器是 Web 服务器,另一台是 DB SQL 服务器。在两台计算机上创建了一个本地管理员帐户(假设为 XYZ)。因此,当我远程登录时,我要么是 WebServer\XYZ
我无法理解 IE7 中的 float 问题。我 div 包含一个向右浮动的列表,以便文本保持在左侧。我使用的方法在其他浏览器中有效,但在 IE7 中无效。我简化了代码以使问题更清楚:
我有两个街区。其中一个呈三 Angular 形。如何围绕这个 div 文本流动?例子: HTML: Triangle Lorem ipsum dolor sit a
我在网上搜索过,似乎找不到一个干净、简单、所有浏览器都友好的 3 列布局。 我希望有 3 列布局,左列固定为 200px,右列固定为 200px,中间列为剩余宽度,但最小宽度为 600px。所以整体最
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this q
我是一名优秀的程序员,十分优秀!