1、创建水印PDF。
1)、创建文字水印pdf文件
代码:
<code>#encoding=utf-8</code>
<code>#author: walker</code>
<code>#date: 2014-03-17</code>
<code>#function: 创建文字水印pdf</code>
<code>from</code> <code>reportlab.pdfgen </code><code>import</code> <code>canvas</code>
<code>from</code> <code>reportlab.lib.units </code><code>import</code> <code>cm</code>
<code>def</code> <code>create_watermark(content):</code>
<code> </code><code>#默认大小为21cm*29.7cm</code>
<code> </code><code>c </code><code>=</code> <code>canvas.Canvas(</code><code>"mark.pdf"</code><code>, pagesize </code><code>=</code> <code>(</code><code>30</code><code>*</code><code>cm, </code><code>30</code><code>*</code><code>cm))</code>
<code> </code><code>#移动坐标原点(坐标系左下为(0,0))</code>
<code> </code><code>c.translate(</code><code>10</code><code>*</code><code>cm, </code><code>5</code><code>*</code><code>cm)</code>
<code> </code>
<code> </code><code>#设置字体</code>
<code> </code><code>c.setFont(</code><code>"Helvetica"</code><code>, </code><code>80</code><code>)</code>
<code> </code><code>#指定描边的颜色</code>
<code> </code><code>c.setStrokeColorRGB(</code><code>0</code><code>, </code><code>1</code><code>, </code><code>0</code><code>)</code>
<code> </code><code>#指定填充颜色</code>
<code> </code><code>c.setFillColorRGB(</code><code>0</code><code>, </code><code>1</code><code>, </code><code>0</code><code>)</code>
<code> </code><code>#画一个矩形</code>
<code> </code><code>c.rect(cm, cm, </code><code>7</code><code>*</code><code>cm, </code><code>17</code><code>*</code><code>cm, fill</code><code>=</code><code>1</code><code>)</code>
<code> </code><code>#旋转45度,坐标系被旋转</code>
<code> </code><code>c.rotate(</code><code>45</code><code>)</code>
<code> </code><code>c.setFillColorRGB(</code><code>0.6</code><code>, </code><code>0</code><code>, </code><code>0</code><code>)</code>
<code> </code><code>#设置透明度,1为不透明</code>
<code> </code><code>c.setFillAlpha(</code><code>0.3</code><code>)</code>
<code> </code><code>#画几个文本,注意坐标系旋转的影响</code>
<code> </code><code>c.drawString(</code><code>3</code><code>*</code><code>cm, </code><code>0</code><code>*</code><code>cm, content)</code>
<code> </code><code>c.setFillAlpha(</code><code>0.6</code><code>)</code>
<code> </code><code>c.drawString(</code><code>6</code><code>*</code><code>cm, </code><code>3</code><code>*</code><code>cm, content)</code>
<code> </code><code>c.setFillAlpha(</code><code>1</code><code>)</code>
<code> </code><code>c.drawString(</code><code>9</code><code>*</code><code>cm, </code><code>6</code><code>*</code><code>cm, content)</code>
<code> </code><code>#关闭并保存pdf文件</code>
<code> </code><code>c.save()</code>
<code>create_watermark(</code><code>'walker'</code><code>)</code>
效果图:
<a href="http://s3.51cto.com/wyfs02/M01/22/C5/wKioL1MmtY7gLmlHAAAnyxSUB4o111.png" target="_blank"></a>
2)、创建图片水印pdf。
<code>#function: 创建图片水印pdf</code>
<code>def</code> <code>create_watermark(f_jpg):</code>
<code> </code><code>f_pdf </code><code>=</code> <code>'mark.pdf'</code>
<code> </code><code>w_pdf </code><code>=</code> <code>20</code><code>*</code><code>cm</code>
<code> </code><code>h_pdf </code><code>=</code> <code>20</code><code>*</code><code>cm</code>
<code> </code>
<code> </code><code>c </code><code>=</code> <code>canvas.Canvas(f_pdf, pagesize </code><code>=</code> <code>(w_pdf, h_pdf))</code>
<code> </code><code>c.setFillAlpha(</code><code>0.3</code><code>) </code><code>#设置透明度</code>
<code> </code><code>print</code> <code>c.drawImage(f_jpg, </code><code>7</code><code>*</code><code>cm, </code><code>7</code><code>*</code><code>cm, </code><code>6</code><code>*</code><code>cm, </code><code>6</code><code>*</code><code>cm) </code><code>#这里的单位是物理尺寸</code>
<code>create_watermark(</code><code>'eg.png'</code><code>)</code>
<a href="http://s3.51cto.com/wyfs02/M01/22/CA/wKioL1MnpDSDEFwrAAAO8juU39g979.png" target="_blank"></a>
2、添加水印。
<code>#date: 2014-03-18</code>
<code>#function:给pdf添加水印</code>
<code>from</code> <code>PyPDF2 </code><code>import</code> <code>PdfFileWriter, PdfFileReader</code>
<code>#所有路径为绝对路径</code>
<code>def</code> <code>add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out):</code>
<code> </code><code>pdf_output </code><code>=</code> <code>PdfFileWriter()</code>
<code> </code><code>input_stream </code><code>=</code> <code>file</code><code>(pdf_file_in, </code><code>'rb'</code><code>)</code>
<code> </code><code>pdf_input </code><code>=</code> <code>PdfFileReader(input_stream)</code>
<code> </code>
<code> </code><code># PDF文件被加密了</code>
<code> </code><code>if</code> <code>pdf_input.getIsEncrypted():</code>
<code> </code><code>print</code> <code>'该PDF文件被加密了.'</code>
<code> </code><code># 尝试用空密码解密</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>pdf_input.decrypt('')</code>
<code> </code><code>except</code> <code>Exception, e:</code>
<code> </code><code>print</code> <code>'尝试用空密码解密失败.'</code>
<code> </code><code>return</code> <code>False</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>print</code> <code>'用空密码解密成功.'</code>
<code> </code><code># 获取PDF文件的页数</code>
<code> </code><code>pageNum </code><code>=</code> <code>pdf_input.getNumPages()</code>
<code> </code><code>#读入水印pdf文件</code>
<code> </code><code>pdf_watermark </code><code>=</code> <code>PdfFileReader(</code><code>file</code><code>(pdf_file_mark, </code><code>'rb'</code><code>))</code>
<code> </code><code># 给每一页打水印</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(pageNum):</code>
<code> </code><code>page </code><code>=</code> <code>pdf_input.getPage(i)</code>
<code> </code><code>page.mergePage(pdf_watermark.getPage(</code><code>0</code><code>))</code>
<code> </code><code>page.compressContentStreams() </code><code>#压缩内容</code>
<code> </code><code>pdf_output.addPage(page)</code>
<a href="http://s3.51cto.com/wyfs02/M02/22/C9/wKiom1MnrYqRqmWpAACf9L-3nXY146.png" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/22/CB/wKioL1MnrWSBsrHhAAChEqREs6g570.png" target="_blank"></a>
本文转自walker snapshot博客51CTO博客,原文链接http://blog.51cto.com/walkerqt/1378142如需转载请自行联系原作者
RQSLT