如何将水印添加到从此代码生成的pdf文件中?
import xhtml2pdf
from xhtml2pdf import pisa
def delivery_cancel(request, did):
d_instance = get_object_or_404(Delivery, pk=did, user=request.user)
users = request.user.get_profile()
user = request.user
contents = render_to_string('delivery_cancel.html', {'delivery':d_instance,'users':users,'user':user})
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'inline; filename=mypdf.pdf'
result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(contents.encode('utf-8')), result, show_error_as_pdf=True, encoding='UTF-8')
response.write(result.getvalue())
result.close()
return response
我尝试使用reportlab但是我失败了,所以我要求另一个解决方案。
答案 0 :(得分:0)
xhtml2pdf
的输入是XHTML,因此您可能希望在那里指定水印。文档says to use a background-image
on @page
。
或者,您可以创建一个仅包含水印的单页PDF,并在使用pdftk
's background
option之类的内容后将其应用于生成的文件。
答案 1 :(得分:0)
我的方法是更长的方法,但它可以解决大多数面临的问题。 使用此脚本,您将能够从xlsx工作表中添加水印电子邮件地址列表,并将与水印相同的电子邮件地址添加到您输入的pdf的所有页面中
# Importing all required packages
import xlrd
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch, cm
from PyPDF2 import PdfFileWriter, PdfFileReader
from reportlab.lib.colors import HexColor
# create watermarked booklet
def final_booklets(file_name,booklet):
watermark_obj = PdfFileReader(file_name)
watermark_page = watermark_obj.getPage(0)
pdf_reader = PdfFileReader(booklet)
pdf_writer = PdfFileWriter()
# Watermark all the pages
for page in range(pdf_reader.getNumPages()):
page = pdf_reader.getPage(page)
page.mergePage(watermark_page)
pdf_writer.addPage(page)
output = file_name+"_booklet.pdf"
with open(output, 'wb') as out:
pdf_writer.write(out)
# Create watermark pdf again each email address
def watermark_pdf(target,booklet):
file_name = (target + ".pdf")
c = canvas.Canvas(file_name)
c.saveState()
c.setFillColor(HexColor('#dee0ea'))
c.setFont("Helvetica", 40)
c.translate(15*cm, 20*cm )
c.rotate(45)
c.drawRightString(0,0,target)
c.restoreState()
c.showPage()
c.save()
final_booklets(file_name,booklet)
# Read the sheet to get everyones email address
def read_xlsx(fn):
book = xlrd.open_workbook(fn)
sheet = book.sheet_by_index(0)
booklet = "book.pdf"
for cell in range(1,sheet.nrows):
target = sheet.cell(cell,1).value
watermark_pdf(target,booklet)
# main controller
if __name__ == "__main__":
fn = "Test.xlsx"
read_xlsx(fn)
原始Github链接:https://github.com/manojitballav/python_watermark/blob/master/master.py