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的展示区域, 实现假修改
"pdftk '%s' input_pw '' multibackground '%s' output '%s'" % (blank_pdf, input_pdf, output_pdf)
merge时会去链接的原因分析: 说到底是pdf这种格式导致的, 其文本和链接存在不同的地方, merge时只merge了文本(再多的楼主也不太清楚)