我有兴趣以编程方式填写现有的PDF表单.我真正需要做的就是从用户输入中提取信息,然后将相应的文本放在适当位置的现有PDF上.我已经可以通过reportlab将相同的纸张送入打印机两次来完成此操作,但这真的让我误解了.
在添加用户输入的文本之前,我很想亲自对每个现有PDF进行逆向工程并自己绘制每一行和每个字符,但我想查看是否有一种简单的方法来获取现有PDF并将其设置为一些额外文本的背景.我更喜欢使用python,因为它是我唯一感觉舒服的语言.
我也意识到我可以只扫描文档本身并使用生成的光栅图像作为背景,但我更喜欢矢量图形的精度.
看起来ReportLab有一个具有此功能的商业产品,而我正在寻找的特定功能就在其中(copyPages) - 但是为一个非盈利用途的单个简单功能支付4位数产品似乎有点过头了.
我一直在使用reportlab处理一些复杂的PDF输出.这些通常都很好,但在某些情况下仍然会出现LayoutErrors - 这些通常是因为Flowables在某些方面太大了.
事实证明调试它们非常困难,因为我通常没有比这样的信息更多的信息;
Flowable <Table@0x104C32290 4 rows x 6 cols> with cell(0,0) containing
'<Paragraph at 0x104df2ea8>Authors'(789.0 x 1176) too large on page 5 in frame 'normal'(801.543307087 x 526.582677165*) of template 'Later'
Run Code Online (Sandbox Code Playgroud)
这真的没那么有用.我理想地想知道的是这种事情的最佳调试和测试策略.
我没有一个特别的例子,所以它更一般的建议,上面的例外我已经解决了但它有点通过试验和错误(阅读;猜测和看到会发生什么).
我写了一个Pdf合并,它将原始文件与水印合并.
我现在要做的是通过Django视图在浏览器中打开'document-output.pdf'文件.我已经检查了Django的相关文章,但由于我的方法相对不同,我不直接创建PDF对象,使用响应对象作为其"文件".所以我有点迷失.
那么,我怎么能在Django视图中呢?
from pyPdf import PdfFileWriter, PdfFileReader
from reportlab.pdfgen.canvas import Canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
output = PdfFileWriter()
input = PdfFileReader(file('file.pdf', 'rb'))
# get number of pages
num_pages = input.getNumPages()
# register new chinese font
pdfmetrics.registerFont(TTFont('chinese_font','/usr/share/fonts/truetype/mac/LiHeiPro.ttf'))
# generate watermark on the fly
pdf = Canvas("watermark.pdf")
pdf.setFont("chinese_font", 12)
pdf.setStrokeColorRGB(0.5, 1, 0)
pdf.drawString(10, 830, "??")
pdf.save()
# put on watermark
watermark = PdfFileReader(file('watermark.pdf', 'rb'))
page1 = input.getPage(0)
page1.mergePage(watermark.getPage(0))
# add processed pdf page
output.addPage(page1)
# then, add …Run Code Online (Sandbox Code Playgroud) 我以编程方式在Python和Reportlab Toolkit中创建PDF文件,每个文件包含数千个文档,每个文档具有可变数量的页面.
我的问题是我需要指示打印机应打印每页的介质类型(例如,文档第一页的预打印信头).看来我需要生成一种持有这种信息的工作单.
我在创建JDF作业单方面取得了一些成功,但这些仅在我组织运行Xerox Freeflow Server 8版的最新打印机上运行.
理想情况下,我需要一个解决方案,它也适用于我们的Freeflow服务器版本7和Xerox DocuSP打印机.我尝试将JDF票证发送到这些打印机失败了.
我可以使用其他类型的票务系统,还是让我们所有的打印机识别JDF文件?
使用ReportLab,我想渲染一个字体大的文本块.现在,我的代码将文本放在段落中,以便它可以自动换行.但是,文本在渲染时会被挤在一起.
似乎没有考虑我为Paragraph对象指定的高度.我可以添加一个Paragraph的属性来解决这个问题吗?
我的代码如下:
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
from reportlab.platypus import Paragraph
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_CENTER
doc = canvas.Canvas('test.pdf')
p = ParagraphStyle('test')
p.textColor = 'black'
p.borderColor = 'black'
p.borderWidth = 1
p.alignment = TA_CENTER
p.fontSize = 100
para = Paragraph("THIS IS A REALLY LONG AND BIG STRING OF TEXT RIGHT HERE!!!!!", p)
para.wrapOn(doc,1200,1000)
para.drawOn(doc, 0.5*inch, 6*inch)
doc.save()
Run Code Online (Sandbox Code Playgroud) 我需要使用动态文本生成PDF并且我正在使用ReportLab.由于文本是动态的,无论如何都要调整大小以适应PDF的特定区域?
我正在使用ReportLab在python中工作.我需要生成PDF格式的报告.数据从数据库中检索并插入表中.这是简单的代码:
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib.units import inch
doc = SimpleDocTemplate("simple_table.pdf", pagesize=letter)
elements = []
data= [['00', '01', '02', '03', '04'],
['10', 'Here is large field retrieve from database', '12', '13', '14'],
['20', '21', '22', '23', '24'],
['30', '31', '32', 'Here is second value', '34']]
t=Table(data)
columnWidth = 1.9*inch;
for x in range(5):
t._argW[x]= cellWidth
elements.append(t)
doc.build(elements)
Run Code Online (Sandbox Code Playgroud)
有三个问题:
cellWidth = 2.9*inch;,页面不可见,不从左右滚动我是如何解决这个问题的?
我带着一个我无法回答的新问题回来,整整一天都摸不着头脑.
我想通过点击"下载PDF"按钮从网页生成PDF.我尝试了几个模块,包括Reportlab和XHTML2PDF,但我无法生成任何pdf,也无法下载...这是我在Reportlab中做的,在Django网站中将HTML渲染为PDF
- - views.py - -
import cStringIO as StringIO
import ho.pisa as pisa
from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
from cgi import escape
def index_data(request):
#Code to generate data
return render(request, "analytics/stat.html", locals())
return render_to_pdf(
'analytics/stat.html',
{
'pagesize':'A4',
'mylist': results,
}
)
def render_to_pdf(template_src, context_dict):
template = get_template(template_src)
context = Context(context_dict)
html = template.render(context)
result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("ISO-8859-1")), result)
if not pdf.err:
return HttpResponse(result.getvalue(), content_type='application/pdf')
return HttpResponse('We …Run Code Online (Sandbox Code Playgroud) 尝试通过 python 3 使用 reportlab 编写包含宏宏的文档 (\xc4\x81 \xc4\x93 \xc4\xab \xc5\x8d \xc5\xab),但宏宏显示为框 (\xe2\x96 \xa0). 该文档是用 Arial 字体编写的 - 但如果我在文字处理程序中打开该文件来检查字体,则这些框采用“Segoe UI Symbol”字体。
\n\n要在 Arial 中导入为支持多种 unicode 字符的字体(这似乎有效):
\n\nimport reportlab.rl_config\nreportlab.rl_config.warnOnMissingFontGlyphs = 0\nfrom reportlab.pdfbase import pdfmetrics\nfrom reportlab.pdfbase.ttfonts import TTFont\npdfmetrics.registerFont(TTFont(\'Arial\', \'Arial.ttf\'))\nRun Code Online (Sandbox Code Playgroud)\n\n我还通过 json 导入字典,当我在记事本中打开 json 文件时,看起来像这样:
\n\n{"example1":"b\\u0101s"}\nRun Code Online (Sandbox Code Playgroud)\n\n该程序读取并写入这个字典:
\n\nfrom reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer\nfrom reportlab.lib.styles import getSampleStyleSheet\ndoc = SimpleDocTemplate("hello.pdf")\nStory = [Spacer(1,2*inch)]\nstyle = styles["Normal"]\nwith open(\'CompDict.json\',\'r\') as f:\n m_dic=json.load(f)\nfor key,value in m_dic:\n p=Paragraph(key+":"+value,style)\n Story.append(p)\ndoc.build(Story)\nRun Code Online (Sandbox Code Playgroud)\n\n结果应该是一个 pdf 文件,example1:b\xc4\x81s但结果却是example1:b\xe2\x96\xa0s …
我正在使用reportlab生成pdf,我希望我的标题位于中心。但如何实现,找不到解决方案。
这是我的代码:
def add_text(text, style="Normal", fontsize=12):
Story.append(Spacer(1, 12))
ptext = "<font size={}>{}</font>".format(fontsize, text)
Story.append(Paragraph(ptext, styles[style]))
Story.append(Spacer(1, 12))
add_text("Title", style="Heading1", fontsize=24)
Run Code Online (Sandbox Code Playgroud)