天天看點

Python添加pdf水印

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