Python 如何将水印添加到pdf文件?

Python 如何将水印添加到pdf文件?,python,django,Python,Django,如何将水印添加到由该代码生成的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

如何将水印添加到由该代码生成的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,但失败了,因此我请求另一种解决方案。

xhtml2pdf的输入是XHTML,因此您可能希望在其中指定水印。文件


或者,您可以创建一个只包含水印的单页PDF,并在事后使用类似的方法将其应用于生成的文件。

我的方法比较长,但应该可以解决所面临的大多数问题。 使用此脚本,您将能够从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链接: