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

    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了文本(再多的楼主也不太清楚)

你可能感兴趣的:(PDF,python)