开发者社区> 科技探索者> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

给PDF添加水印(Python+C#)

简介:
+关注继续查看

1、Python + PDFlib

   以下是用PDFlib给pdf添加水印的速记,另外PDFStamp是个很好用的pdf水印工具。PDFlib功能比较多、杂;PDFStamp功能单一,更方便使用。据walker测试,PDFlib会比PDFStamp快一些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#encoding=utf-8
#author: walker
#date: 2014-03-27
 
from PDFlib.PDFlib import PDFlib
from PDFlib.PDFlib import PDFlibException
 
#给单个文件添加水印,在右上角和左下角各添加一个水印
#所有参数均为全路径文件名
def add_watermark(pdf_file_in, pdf_file_out, image_file):
    = PDFlib()
    p.set_option("license=xxxxx")   #your key
    p.set_option("errorpolicy=return");
                  
    if (p.begin_document(pdf_file_out, "") == -1):
        raise PDFlibException("Error: " + p.get_errmsg())
    p.set_info("Author""walker");
    p.set_info("Title", "");
    p.set_info("Creator""walker");
    p.set_info("Subject", "");
    p.set_info("Keywords", "");
    #p.set_info("Producer", "walker");
    #输入文件
    indoc = p.open_pdi_document(pdf_file_in, "");
    if (indoc == -1):
        raise PDFlibException("Error: " + p.get_errmsg())
                  
    endpage = p.pcos_get_number(indoc, "length:pages");
    endpage = int(endpage)
                  
    image = p.load_image("auto", image_file, "")
    if image == -1:
        raise PDFlibException("Error: " + p.get_errmsg())
                  
    for pageno in range(1, endpage+1):
        page = p.open_pdi_page(indoc, pageno, "");
        if (page == -1):
            raise PDFlibException("Error: " + p.get_errmsg())
        p.begin_page_ext(00, "");     #添加一页
                      
        p.fit_pdi_page(page, 00"adjustpage")
        page_width = p.get_value("pagewidth"0)    #单位为像素72dpi下像素值
        page_height = p.get_value("pageheight"0)  #单位为像素72dpi下像素值
                      
        imagewidth = p.info_image(image, "imagewidth", "");
        imageheight = p.info_image(image, "imageheight", "");
                      
        margin = 1000   #用于设置水印边距
                      
        optlist_top = "boxsize={" + str(page_width) + " " + str(page_height) + "} "
        optlist_top += "position={" + str(margin/page_width) + " " + str(margin/ page_height) + "} "
        optlist_top += " fitmethod=clip dpi=96"
                      
        optlist_bottom = "boxsize={" + str(page_width) + " " + str(page_height) + "} "
        optlist_bottom += "position={" + str(100 - margin/page_width) + " " + str(100 - margin/ page_height) + "} "
        optlist_bottom += " fitmethod=clip dpi=96"
                      
        p.fit_image(image, 00, optlist_bottom)
        p.fit_image(image, 00, optlist_top)
                      
        p.close_pdi_page(page);
        p.end_page_ext("");
                  
    p.close_image(image)
    p.end_document("")

2、C# + iTextSharp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
//给单个文件添加水印,在右上角和左下角各添加一个水印
//所有参数均为全路径文件名
bool add_watermark(string srcPdf, string dstPdf, string imagepath)
{         
    iTextSharp.text.Image img = Image.GetInstance(imagepath);
    PdfReader reader = new PdfReader(srcPdf);
    PdfStamper stamp = new PdfStamper(reader, new FileStream(dstPdf, FileMode.Create));
 
    PdfContentByte page;
    float width = reader.GetPageSize(1).Width;
    float height = reader.GetPageSize(1).Height;
    int num = reader.NumberOfPages;
    for (int i = 1; i <= num; ++i)
    {
        page = stamp.GetOverContent(i);
 
        img.SetAbsolutePosition(margin, margin);
        page.AddImage(img);
 
        img.SetAbsolutePosition(width - img.Width - margin, height - img.Height - margin);
        page.AddImage(img);
    }
 
    stamp.Close();
    reader.Close();
 
    return true;
}


相关阅读:

1、Python添加pdf水印

2、PDFlib8注册机和序列号产生规则


*** walker ***

本文转自walker snapshot博客51CTO博客,原文链接http://blog.51cto.com/walkerqt/1385138如需转载请自行联系原作者

RQSLT

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何使用Python将几十个PDF文件合并成一个PDF?其实只需要这四步
  假定你有一个很无聊的任务,需要将几十个PDF文件合并成一个PDF文件。每一个文件都有一个封面作为第一页,但你不希望合并后的文件中重复出现这些封面。即使有许多免费的程序可以合并PDF,很多也只是简单的将文件合并在一起。让我们来写一个Python程序,定制需要合并到PDF中的页面。   总的来说,该程序需要完成:   找到当前工作目录中所有PDF文件。按文件名排序,这样就能有序地添加这些PDF。除了第一页之外,将每个PDF的所有页面写入输出的文件。   从实现的角度来看,代码需要完成下列任务:   调用os.listdir(),找到当前工作目录中的所有文件,去除掉非PDF文件。调用Py
0 0
Python编程:MySQLdb模块对数据库的基本增删改查操作
Python编程:MySQLdb模块对数据库的基本增删改查操作
0 0
Python编程:entry_points将Python模块转变为命令行工具
Python编程:entry_points将Python模块转变为命令行工具
0 0
Python编程:SQLAlchemy查询数据没有变化
遇到一个问题,使用一条相同的sql,多次查询数据库,每次数据都一样,而且数据库更新了,也没有查到新数据 经过Google,发现是SQLAlchemy的缓存机制导致的 设置隔离级别参数isolation_level 就可以解决
0 0
Python编程:运行目录或zip压缩文件
Python编程:运行目录或zip压缩文件
0 0
Python编程:PyThink数据库交互模块提高爬虫编写速度
Python编程:PyThink数据库交互模块提高爬虫编写速度
0 0
Python编程:glob模块进行文件名模式匹配
Python编程:glob模块进行文件名模式匹配
0 0
Python编程:heapq模块堆排序
堆是一个二叉树,其中每个父节点的值都小于或等于其所有子节点的值。 整个堆的最小元素总是位于二叉树的根节点。 python的heapq模块提供了对堆的支持。 堆数据结构最重要的特征是heap[0]永远是最小的元素
0 0
Python编程:实现消息发布/订阅模型
Python编程:实现消息发布/订阅模型
0 0
Python编程:abc模块实现抽象类
Python编程:abc模块实现抽象类
0 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Python系列直播第一讲——Python中的一切皆对象
立即下载
Python 脚本速查手册
立即下载
Python第五讲——关于爬虫如何做js逆向的思路
立即下载