除去pdf文件内部的超链接/a标签

来源:互联网 发布:软件开发人员外包 编辑:程序博客网 时间:2024/06/05 18:31

    pdf格式是一个比较固定的,正常状态下是不能编辑的格式,主要用来传递信息和展示,但项目中或迟或早的肯定会遇到需要修改pdf内容的需求,目前遇到的就有:pdf2html, pdf2png, pdf内部去链接, pdf加水印, 修改删除pdf文档内容(去水印)……
    目前, 所有需求都已经实现, 具体如下:

pdf2png: 用imagemagick可以实现, 不赘述;
pdf2html: 使用html2pdfEX, http://blog.csdn.net/chijiaodaxie/article/details/47684089
pdf加水印: 使用java的itext模块, http://blog.csdn.net/chijiaodaxie/article/details/50223479
pdf内容修改(有内容遮罩, 定点删除, 内容匹配删除)的批量自动化, 已有代码, 合适的时候在放出来
本节讲pdf内部去链接

其实用到的是比较偏门的方法: pdf的merge功能会导致pdf里面所有的链接失效
1. 使用语言的模块(如java的itext, python的pyPDF, reportlab):

existing_pdf = PdfFileReader(file(input_pdf, "rb"))    isEncrypted = existing_pdf.isEncrypted    if isEncrypted:        existing_pdf.decrypt('')    page_nums = existing_pdf.getNumPages()    output = PdfFileWriter()    pdf_size = getPdfsize(input_pdf, 0, 0)    packet = StringIO.StringIO()    doc = LetterMaker(packet, "The MVP", 10,pdf_size)    doc.createDocument()    doc.savePDF()    packet.seek(0)    new_pdf = PdfFileReader(packet)    page_blank = new_pdf.getPage(0)    merger_error = False    for page_index in range(page_nums)[:]:        # output.addPage(page_blank)        print "Page: ",page_index + 1        page = copy.deepcopy(page_blank)        page2 = copy.deepcopy(page_blank)        try:            exist_page = existing_pdf.getPage(page_index)            # exist_page.trimBox.lowerLeft = (25, 25)            # exist_page.trimBox.upperRight = (225, 225)            # exist_page.cropBox.lowerLeft = (0, 0)            # exist_page.cropBox.upperRight = pdf_size            print exist_page.artBox            print exist_page.bleedBox            print exist_page.cropBox            print exist_page.cropBox.lowerLeft            print type(exist_page.cropBox.lowerLeft)                        print type(exist_page.cropBox.lowerLeft[0])            print type(exist_page.cropBox.lowerLeft[1])            print exist_page.cropBox.upperRight            print exist_page.mediaBox            print exist_page.trimBox            # page.mergePage(exist_page.rotateClockwise(180))            # page2.mergePage(page.rotateClockwise(180))        except Exception, e:            merger_error = True            for page_index in range(page_nums)[:]:                output.addPage(page)            break        output.addPage(exist_page)

其中mergePage可以去链接, 操作cropBox可以调节pdf的展示区域, 实现假修改

  1. 使用pdftk的background/stamp功能
    直接在command line运行(需要将下面的string用python的语法解析):
"pdftk '%s' input_pw '' multibackground '%s' output '%s'" % (blank_pdf, input_pdf, output_pdf)

merge时会去链接的原因分析: 说到底是pdf这种格式导致的, 其文本和链接存在不同的地方, merge时只merge了文本(再多的楼主也不太清楚)

1 0
原创粉丝点击