我有以下ReportLab代码:
t = c.beginText()
t.setFont('Arial', 25)
t.setCharSpace(3)
t.setTextOrigin(159,782)
t.textLine("Some string")
c.drawText(t)
Run Code Online (Sandbox Code Playgroud)
我想要实现的是:在每个字符(setCharSpace)之间有一个3(像素?)的空格,并将结果字符串对齐在页面中某个区域的中心
就我发现而言,textobject是唯一的方法,我可以指定字符之间的空格.
有任何想法吗?
我正在使用ReportLab在PDF文档中编写表格,并对结果非常满意(尽管还没有完全掌握Flowables).
但是,我无法弄清楚如何使一个跨越分页符的表重复其列标题.
下面的代码在C:\ Temp中创建一个test.pdf,它有一个标题行,后跟99行数据.
标题行在第一页看起来很棒,但我希望在第二页和第三页的顶部重复.
我很想知道使用SimpleDocTemplate完成任何方法的方法.
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Frame, Spacer
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.pagesizes import A3, A4, landscape, portrait
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
from reportlab.pdfgen import canvas
pdfReportPages = "C:\\Temp\\test.pdf"
doc = SimpleDocTemplate(pdfReportPages, pagesize=A4)
# container for the "Flowable" objects
elements = []
styles=getSampleStyleSheet()
styleN = styles["Normal"]
# Make heading for each column
column1Heading = Paragraph("<para align=center>COLUMN ONE HEADING</para>",styles['Normal'])
column2Heading = …Run Code Online (Sandbox Code Playgroud) 有没有办法从pdf文档中提取图像(使用PyPDF2库)?也可以将一些图像替换为另一个图像(例如用PIL生成或从文件加载)?
我能够从pdf对象树中获取EncodedStreamObject并获得编码流(通过调用getData()方法),但看起来它只是原始内容,没有任何图像标题和其他元信息.
>>> import PyPDF2
>>> # sample.pdf contains png images
>>> reader = PyPDF2.PdfFileReader(open('sample.pdf', 'rb'))
>>> reader.resolvedObjects[0][9]
{'/BitsPerComponent': 8,
'/ColorSpace': ['/ICCBased', IndirectObject(20, 0)],
'/Filter': '/FlateDecode',
'/Height': 30,
'/Subtype': '/Image',
'/Type': '/XObject',
'/Width': 100}
>>>
>>> reader.resolvedObjects[0][9].__class__
PyPDF2.generic.EncodedStreamObject
>>>
>>> s = reader.resolvedObjects[0][9].getData()
>>> len(s), s[:10]
(9000, '\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc')
Run Code Online (Sandbox Code Playgroud)
我已经仔细研究过PyPDF2,ReportLab和PDFMiner解决方案,但没有找到类似我正在寻找的东西.
任何代码示例和链接都将非常有用.
我想将matplotlib图表直接嵌入到由ReportLab生成的PDF中 - 即不首先保存为PNG,然后将PNG嵌入到PDF中(我想我会得到更好的输出质量).
有谁知道是否有一个matplotlib可流动的ReportLab?
谢谢
我正在尝试使用reportlab在Django-Installation中在服务器端构建PDF文档.这些文档应该包含几个用matplotlib创建的图表.
我已经想出如何通过将PIL-Image对象直接传递给Image()-flowable 来使reportlab使用matplotlib的图像而不将它们临时转储到文件系统.这对于像PNG这样的光栅化图像格式非常有效.
现在,锦上添花就能嵌入基于矢量的图形(如SVG).
我使用svglib将matplotlib生成的SVG转换为reportlab图形对象,但不幸的是svglib确实省略了tickmarks和axis标签.在一些图表上,它总体上失败了.
你们有什么想法吗?
我正在使用Table of Report Lab库在PDF报告上打印表格.我想知道是否可以配置表来执行单元格内容的自动包装.
例如,我的文本不适合列中的单元格.我希望表执行自动调整单元格的内容以适应列宽.可能吗?
我想使用drawImage方法将使用matplotlib生成的图形添加到reportlab画布中,而不必先将图形保存到硬盘驱动器中.
我的问题与以下内容有关: ReportLab是否有可流动的matplotlib?,很好地解决了.但是,我不想使用DocTemplates,Stories,Flowables等.如上所述,我想使用drawImage将它放在画布中的某个位置.
我尝试使用以下方法将matplotlib图转换为PIL图像:
2)http://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server
例如,一些无法工作的代码是:
import Image
import matplotlib.pyplot as plt
import cStringIO
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch, cm
fig = plt.figure(figsize=(4, 3))
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
imgdata = cStringIO.StringIO()
fig.savefig(imgdata, format='png')
imgdata.seek(0) # rewind the data
im = Image.open(imgdata)
c = canvas.Canvas('test.pdf')
#c.drawImage(imgdata, cm, cm, inch, inch)
c.drawImage(im, cm, cm, inch, inch)
c.save()
Run Code Online (Sandbox Code Playgroud)
试图imgdata在错误中绘制结果:
AttributeError: 'cStringIO.StringO' object has no attribute 'rfind'
Run Code Online (Sandbox Code Playgroud)
虽然绘图im给出:
AttributeError: rfind
Run Code Online (Sandbox Code Playgroud)
现在有人如何解决这个问题?任何帮助将不胜感激.
我需要生成100多页的PDF文档.这个过程需要处理大量数据,而且一次性生成需要更多的时间和内存.
我尝试了几种不同的方法来破解我的方式:
随着不同的结果,我得到它的工作,但它很慢,需要更多的内存(有时达到实例软内存限制).目前,我在不同的任务中生成一些部分,将每个部分存储在blobstore中,并将这些部分与pyPdf合并,但它会在较大的文档上窒息.
我正在生成的文档并不复杂,主要是表格和文本,没有内部引用,没有TOC,没有任何应该知道文档其余部分的内容.我可以使用platypus进行布局,我不需要花哨的文档外观或HTML2PDF转换.
目标是以数据存储允许的速度生成文档.并行页面生成会很好,但不是必需的.
我正在考虑使用blobstore文件api逐页生成,其中每个任务将生成一个页面,最后一个任务将最终确定blobstore文件,使其可读.但我似乎无法找到如何,暂停生成,将部分PDF存储到流中,并使用该流恢复生成以在不同的任务中生成下一页.
所以我的问题是:
如何在GAE上生成大于几页的PDF文档,在任务请求之间拆分生成,然后将生成的文档存储在blobstore中?
如果使用reportlab无法进行生成拆分,那么如何最小化合并不同PDF文档的占用空间,以使其符合GAE任务请求设置的限制?
更新: 转换API的替代品非常感谢.
第二个更新 转换API正在退役,因此现在不是一个选项.
第3次更新 可以在这里获得Pileline或MapReduce API的帮助吗?
当我从任何源PDF中打印PDF时,文件大小会下降并删除表单中显示的文本框.简而言之,它会使文件变平.这是我想要实现的行为.
下面的代码使用另一个PDF作为源(我想要展平的那个)来创建PDF,它也会写入文本框形式.
我可以在没有文本框的情况下获得PDF,将其展平吗?就像Adobe在PDF上打印PDF一样.
我的其他代码看起来像这样减去一些东西:
import os
import StringIO
from pyPdf import PdfFileWriter, PdfFileReader
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
directory = os.path.join(os.getcwd(), "source") # dir we are interested in
fif = [f for f in os.listdir(directory) if f[-3:] == 'pdf'] # get the PDFs
for i in fif:
packet = StringIO.StringIO()
can = canvas.Canvas(packet, pagesize=letter)
can.rotate(-90)
can.save()
packet.seek(0)
new_pdf = PdfFileReader(packet)
fname = os.path.join('source', i)
existing_pdf = PdfFileReader(file(fname, "rb"))
output = PdfFileWriter()
nump = existing_pdf.getNumPages()
page = existing_pdf.getPage(0) …Run Code Online (Sandbox Code Playgroud)