如何在pdf文件中添加水印?

时间:2013-12-30 16:13:57

标签: 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 = 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但是我失败了,所以我要求另一个解决方案。

2 个答案:

答案 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