- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Yesterday, I asked a question that was perhaps too broad.
今天,我已经按照我的想法付诸行动,努力实现解决方案。
使用 ReportLab 、 pdfquery 和 PyPDF2 ,我试图在 PDF 文档的数百页上自动生成条形码。
每一页都需要有一个条形码。但是,如果页面右上角有一个字母(“A”到“E”),则它需要使用与上一页相同的条形码。右上角带有字母的文件是具有相似信息的重复表格。
如果不存在字母,则应在该页面上使用唯一的条形码编号(递增 1 即可)。
我的代码似乎可以工作,但我有两个问题:
我似乎无法说出为什么值没有改变。有人知道吗?
代码在这里:
import pdfquery
import os
from io import BytesIO
from PyPDF2 import PdfFileWriter, PdfFileReader
from reportlab.graphics.barcode import eanbc
from reportlab.graphics.shapes import Drawing
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.graphics import renderPDF
pdf = pdfquery.PDFQuery("letters-test.pdf")
total_pages = pdf.doc.catalog['Pages'].resolve()['Count']
print("Total pages", total_pages)
barcode_value = 12345670
output = PdfFileWriter()
for i in range(0, total_pages):
pdf.load(i) # Load page i into memory
duplicate_letter = pdf.pq('LTTextLineHorizontal:in_bbox("432,720,612,820")').text()
if duplicate_letter != '':
print("Page " + str(i+1) + " letter " + str(duplicate_letter))
print(barcode_value)
packet = BytesIO()
c = canvas.Canvas(packet, pagesize=letter)
# draw the eanbc8 code
barcode_eanbc8 = eanbc.Ean8BarcodeWidget(str(barcode_value))
bounds = barcode_eanbc8.getBounds()
width = bounds[2] - bounds[0]
height = bounds[3] - bounds[1]
d = Drawing(50, 10)
d.add(barcode_eanbc8)
renderPDF.draw(d, c, 400, 700)
c.save()
packet.seek(0)
new_pdf = PdfFileReader(packet)
# read existing PDF
existing_pdf = PdfFileReader(open("letters-test.pdf", "rb"))
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(i)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)
else:
# increment barcode value
barcode_value += 1
print("Page " + str(i+1) + " isn't a duplicate.")
print(barcode_value)
packet = BytesIO()
c = canvas.Canvas(packet, pagesize=letter)
# draw the eanbc8 code
barcode_eanbc8 = eanbc.Ean8BarcodeWidget(str(barcode_value))
bounds = barcode_eanbc8.getBounds()
width = bounds[2] - bounds[0]
height = bounds[3] - bounds[1]
d = Drawing(50, 10)
d.add(barcode_eanbc8)
renderPDF.draw(d, c, 420, 710)
c.save()
packet.seek(0)
new_pdf = PdfFileReader(packet)
# read existing PDF
existing_pdf = PdfFileReader(open("letters-test.pdf", "rb"))
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(i)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)
# Clear page i from memory and re load.
# pdf = pdfquery.PDFQuery("letters-test.pdf")
outputStream = open("newpdf.pdf", "wb")
output.write(outputStream)
outputStream.close()
最佳答案
正如 Kamil Nicki 的回答所指出的,Ean8BarcodeWidget
limiting effective digits to 7 :
class Ean8BarcodeWidget(Ean13BarcodeWidget):
_digits=7
...
self.value=max(self._digits-len(value),0)*'0'+value[:self._digits]
您可以更改编码方案或将 EAN 13 条码与 Ean13BarcodeWidget
一起使用,它有 12 位可用。
关于python - 使用 ReportLab 批量生成条形码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51789298/
ReportLab 用户指南中说: The colortest.py script in reportlab/demos/colors demonstrates thedifferent ways i
ReportLab 用户指南中说: The colortest.py script in reportlab/demos/colors demonstrates thedifferent ways i
我正在使用 ReportLab VerticalBarChart 生成条形图。我需要其中一个条(每次都是不同的)与其他条的颜色不同,以指定它是“选择”值。 否则,我需要以与其他栏不同的方式标记它。 知
我正在使用 ReportLab 生成 PDF 报告。 我使用了 SimpleDocTemplate 并设置了 pageSize = A5。但是在构建PDF后,当我打开创建的文件时,页面大小为A4。 d
是否可以在段落样式中设置字母/字符间距?我尝试使用spaceShrinkage但这没有任何区别 最佳答案 根据official documentation ,p。 30: The setCharSpa
我的销售订单模板中有以下 rml: [[ repeatIn(o.order_line, 'l') ]] [[ l.name ]] [[
你好, 我正在使用报告实验室生成 pdf。我想绘制一个文本,它是一个 Paragraph,代表一个标题,因此,如果标题比段落的可用长度长,它将在下一行拆分,如果标题太长适合段落的可用宽度和高度,然后调
如何设置表格的左侧位置? response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = '
在报告实验室中 user guide (第 79 页),这是将图像插入表格的方式。 I = Image('../images/replogo.gif') I.drawHeight = 1.25*inc
reportlab文档中有LINEBELOW和LINEABOVE。但我找不到定义右边界或左边界(LINELEFT、LINERIGHT)的方法。 关于如何渲染只有右边框的单元格有什么建议吗? 编辑: 我
有什么方法可以在 reportlab 中获取 Flowable Paragraph 的行数?我有一个很长的字符串,用不同的大小和字体打印。我需要知道要使用 TA_JUSTIFY 对齐打印的整个段落使用
在文档和源代码中,我看到很多对圆角矩形的引用,但是,我似乎无法绘制一个。 我正在绘制一个普通的矩形: canvas.rect(15, 625, 250, 125, fill=0) 我向圆角传递哪些参数
我正在处理发票,我只想在最后一页(也可以是第一页)添加页脚。 由于表的数据是动态的,我无法计算页数。 现在我正在使用 2 个页面模板,第一页(带有 2 个框架和页脚 1)和下一页(带有 1 个框架和页
我知道 LINEABOVE 和 LINEBELOW 样式,我想知道是否有一种方法可以在表格中绘制一条指定宽度的线。 我正在尝试添加一条不“接触”表格边框的线,如果我可以在单元格之间添加一些填充,LIN
我快速浏览了一下网络,但未能找到一种在 Python 中使用 ReportLab 生成 PDF 时设置背景颜色的方法。如何设置背景颜色? 最佳答案 不要使用复杂的方法,而是使用这个简单的技巧: im
我想知道如何将我的脚本保存到桌面。这是我的代码: from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import let
您好,我是报告实验室的新手。我想生成一份包含表格的 pdf 报告。表格中的某些列文本大于列宽,现在我想根据列宽换行文本。 以下是我编写的代码 # Imports from reportlab.pdfg
我正在使用XPreformatted打印一些预格式化的文本,我有一个 换行符的问题。 换行符正确翻译,但另外我得到一个 每行末尾都有“问号”。 这是我的输出: first line? second l
我知道 LINEABOVE 和 LINEBELOW 样式,我想知道是否有一种方法可以在表格中绘制一条指定宽度的线。 我正在尝试添加一条不“接触”表格边框的线,如果我可以在单元格之间添加一些填充,LIN
我快速浏览了一下网络,但未能找到一种在 Python 中使用 ReportLab 生成 PDF 时设置背景颜色的方法。如何设置背景颜色? 最佳答案 不要使用复杂的方法,而是使用这个简单的技巧: im
我是一名优秀的程序员,十分优秀!