图像和办公文档处理(图片,生成word,生成pdf,pdf转纯文本,读取生成excel)

图片处理

用Pillow操作图像
Pillow是python著名图像处理库PIL的分支

#测试颜色pillow
import PIL
from PIL import  Image, ImageFilter
def main():
	image = PIL.Image.open('70_2476.jpg')
	print(image.size,image.format,image.mode)
	#裁剪图片
	#(距离左侧像素,距离上侧像素,左侧像素+截取图片宽度,上侧像素+截取图片宽度)
	#即(left,left+width,top,top+height)
	#j截取距离左侧200,宽度是700,距离上侧100,宽度是600
	rect = (400,200,600,600)
	image_suo =  image.crop(rect)
	image_suo.save('70_2476_caijian.jpg')
	#缩略图
	size = 400,200
	image.thumbnail(size)
	image.save('70_2476_suolue.jpg')

	#黏贴图像
	image2 = PIL.Image.open('70_1100.jpg')
	#将image_suo粘贴在image2,距离左侧200,距离上侧200的位置
	image2.paste(image_suo,(200,100))
	image2.save('70_1100_zhantie.jpg')
	#旋转
	#旋转180度
	image2_xuanzhuan = image2.rotate(180)
	image2_xuanzhuan.save('70_1100_xuanzhuan.jpg')
	#翻转图像FLIP_TOP_BOTTOM上下翻转,FLIP_LEFT_RIGHT左右反转
	image2_fanzhuan = image2.transpose(Image.FLIP_TOP_BOTTOM)
	image2_fanzhuan.save('70_1100_fanzhuan.jpg')
	#操作像素
	#putpixel()在指定的坐标处,指定颜色rgb
	for x in range(200,250):
		for y in range(300,350):
			image2_fanzhuan.putpixel((x, y), (255, 210, 128))
	image2_fanzhuan.save('image2_fanzhuan_pixel.jpg')
	#各种滤镜ImageFilter.BLUR,ImageFilter.CONTOUR,ImageFilter.DETAIL
	image2_fanzhuan.filter(ImageFilter.CONTOUR).save('image2_fanzhuan_lvjing.jpg')
if __name__ == '__main__':
	main()

python处理excel

有很多第三方包,如xlrd,xlwt,openpyxl等。

xlrd,xlwt支持老版本的excel,具体是支持2003年以前的excel,老版本excel行数,列数有最大值限制,不能写入超过65535行、256列的数据。

import xlrd
def main():
	#打开工作表,创建对象
	wb = xlrd.open_workbook('filpath')
	#返回工作表中所有的工作簿,可以通过索引调用
	sheetLst = wb.sheets()
	sheet1 = wb.sheet_by_index(0)
	sheet2 = sheetLst[0]
	#返回工作表中所有的工作簿名称,可以通过名称调用
	sheetNameLst = wb.sheet_names()
	sheet3= wb.sheet_by_name()

	#获取工作簿的行数和列数
	nrows = sheet1.nrows
	ncols = sheet1.ncols

	#获取某一行或者某一列的数据
	#rowNum:行号,startRow:开始行,endRow:结束航
	rowData  = sheet1.row_values('rowNum','startRow','endRow')
	colData = sheet1.col_values('colNum','startCol','endCol')

	#操纵单元格
	for row in sheet1.nrows:
		for col in sheet1.ncols:
			print(sheet1.cell(row,col).value)


if __name__ == '__main__':
	main()

xlwt

import xlwt
def main():
	#创建工作表
	wb = xlwt.Workbook()
	#添加工作簿cell_overwrite_ok参数控制是否可以对同一单元格重复操作覆盖等。
	sheet = wb.add_sheet('sheetName',cell_overwrite_ok=True)
	#给单元格赋值
	sheet.write('rowNum','colNum','value')
	#保存工作表,只能保存成xls,不能xlsx
	wb.save('fileName.xls')


if __name__ == '__main__':
	main()

openpyxl

#注意openpyxl的行,列的起始索引都是1。
import openpyxl
def main():
	#打开工作表
	wb = openpyxl.load_workbook('filepath')
	#获取工作簿列表或者名字
	sheets = wb.worksheets
	sheetNames = wb.sheetnames
	#get_sheet_names(),get_sheet_by_name()已经不建议使用
	#某一个工作簿
	sheet = sheets[0]
	sheet1 = wb[sheetNames[0]] #通过工作簿名字
	#最大行,最小行
	rows = sheet1.max_row
	cols = sheet1.max_column
	#按行获取单元格对象,所有单元格。相当于iter_rows()
	rowCells= sheet1.rows
	for cellRow in rowCells:
		print(','.join([cell.value  for cell in cellRow]))
	#按行获取单元格
	cells = sheet1.iter_rows('min_row','max_row','min_col','max_col')
	#按列获取单元格
	sheet1.iter_columns('min_row','max_row','min_col','max_col')
	for cellRow in cells:
		print(cellRow	)

	#操作单元格,
	value = sheet1.cell(row=1,column=2).value
	wb = openpyxl.Workbook()
	sheet = wb.create_sheet('tile',index)
	#单元格赋值
	sheet.cell(row=2,column=5).value = 5
	#逐行写,添加一行到当前sheet的最底部(即逐行追加从第一行开始) iterable必须是list,tuple,dict,range,generator类型的。 1,如果是list,将list从头到尾顺序添加。 2,如果是dict,按照相应的键添加相应的键值。
	#sheet.append(iterable)
	sheet.append(['This is A1', 'This is B1', 'This is C1'])
	sheet.append({'A': 'This is A1', 'C': 'This is C1'})
	sheet.append({1: 'This is A1', 3: 'This is C1'})
	wb.save('balances.xlsx')
xlrdxlwtopenpyxl
打开或创建工作表wb= open_workbook(filepath)wb= Workbook(filepath)wb= load_workbook(filepath)或Workbook(filepath)
获取所有工作簿wb.sheets()或wb.sheet_names()属性不是方法 wb.worksheets, wb.sheetnames
获取或添加工作簿wb.sheets()[0]、wb.sheet_by_index(0)、wb.sheet_by_name(name)wb.add_sheet(‘sheetName’)wb.worksheets()[0]或wb[name]
工作簿行数,列数sheet.nrows、sheet.ncolssheet.max_row或sheet .max_column
按行获取单元格sheet.row_values(‘rowNum’,‘startRow’,‘endRow’)sheet.iter_rows(‘min_row’,‘max_row’,‘min_col’,‘max_col’)
按列获取单元格sheet.col_values(‘colNum’,‘startCol’,‘endCol’)sheet.iter_columns(‘min_row’,‘max_row’,‘min_col’,‘max_col’)
操作单元格sheet.cell(row,col).valuesheet.write(‘rowNum’,‘colNum’,‘value’)sheet.cell(row=2,column=5).value = 5
保存wb.save(‘fileName.xls’)wb.save(‘balances.xlsx’)

操作word

python-docx是python提供的操作word的第三方包.

from docx import Document
from docx.shared import RGBColor
from docx.shared import Inches,Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.enum.style import WD_STYLE_TYPE
from docx.oxml.ns import qn
def main():
	 document = Document()
	 #修改文档样式Normal的字体类型,大小,颜色
	 document.styles['Normal'].font.name = u'微软雅黑'
	 document.styles['Normal'].font.size = Pt(10)
	 document.styles['Normal'].font.color.rgb = RGBColor(72, 62, 65)
	 document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
	 
	 #添加样式CitationsBold
     styleBold = document.styles.add_style('CitationsBold', WD_STYLE_TYPE.PARAGRAPH)
     paragraph_format_bold = styleBold.paragraph_format
     #首行缩进
     paragraph_format.first_line_indent = Inches(0.25)
     #段前间距
     paragraph_format_bold.space_before = Pt(30)
     #段后间距
     paragraph_format_bold.space_after = Pt(30)
     #段内间距
     paragraph_format_bold.line_spacing = Pt(20)
     styleBold.font.color.rgb = RGBColor(72, 62, 65)
     styleBold.font.name = u'微软雅黑'
     styleBold.font.size = Pt(17)
     styleBold.font.bold = True
     styleBold._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
     #添加一级标题
 	 runTitle0 = document.add_heading(level=1).add_run("研究报告" )
  	 runTitle0.font.name = u'微软雅黑'
     runTitle0._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
     #添加段落,赋予样式
     document.add_paragraph( '研究动态', style='CitationsBold')
     #添加图片
     document.add_picture(stackplot, width=Inches(5.9))
     #保存
     document.save("filename.docx")
     
     

pdf转纯文本

import os
import re,codecs
from pdfminer.converter import PDFPageAggregator
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.layout import *

def pdfTotxt(filepath):
	try:

		fp = file(filepath, 'rb')
		# 创建一个PDF文档解析器对象
		parser = PDFParser(fp)
		document = PDFDocument(parser)
		# 创建一个PDF资源管理器对象来存储共享资源
		# caching = False不缓存
		rsrcmgr = PDFResourceManager(caching=False)
		# 创建一个PDF设备对象
		laparams = LAParams()
		# 创建一个PDF页面聚合对象
		device = PDFPageAggregator(rsrcmgr, laparams=laparams)
		# 创建一个PDF解析器对象
		interpreter = PDFPageInterpreter(rsrcmgr, device)
		replace = re.compile(r'\s+');
		content = ''
		# 循环遍历列表,每次处理一个page的内容
		for page in PDFPage.create_pages(document):
			interpreter.process_page(page)
			# 接受该页面的LTPage对象
			layout = device.get_result()
			# 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象
			# 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等
			for x in layout:
				# 如果x是水平文本对象的话
				if (isinstance(x, LTTextBoxHorizontal)):
					text = re.sub(replace, '', x.get_text())
					text = text.replace(u'.', '')
					if len(text) != 0:
						content += text

		# 关闭输入流
		fp.close()
		device.close()
		return content

	except Exception, e:
		print "Exception:", e

生成pdf文件

from reportlab.pdfgen.canvas import Canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
# pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont('simhei', 'simhei.ttf'))
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_CENTER
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Image,Frame, PageTemplate
def footer(canvas):
    """
    设置页脚或页眉
    :param canvas:Canvas类型  pdf画布
    """
    canvas.saveState()  # 先保存当前的画布状态
    # pageNumber = ("--%s--" % canvas.getPageNumber())  # 获取当前的页码 
    pageNumber = ("选题指南")
    stylesheet = getSampleStyleSheet()
    stylesheet.add(ParagraphStyle(fontName='simhei', name='simhei', leading=12, fontSize=8))
    p = Paragraph(pageNumber,stylesheet['simhei'])
    w, h = p.wrap(200 , 100 )  # 申请一块1cm大小的空间,返回值是实际使用的空间
    p.drawOn(canvas, 235,  810)  # 将页码放在指示坐标处
    canvas.restoreState()
    
def main():
	#设置样式	
	stylesheet = getSampleStyleSheet()
	stylesheet.add(ParagraphStyle(fontName='simhei', name='simhei', leading=15, fontSize=10,spaceAfter=6,spaceBefore=6))
	stylesheet.add(ParagraphStyle(name='titledef',parent=stylesheet['Normal'],fontName = 'simhei',fontSize=18,leading=22,alignment=TA_CENTER,spaceAfter=6))
	stylesheet.add(ParagraphStyle(name='head1def',parent=stylesheet['Normal'],fontName = 'simhei',fontSize=14,leading=18,spaceBefore=12,spaceAfter=6))
	stylesheet.add(ParagraphStyle(name='head2def',parent=stylesheet['Normal'],fontName = 'simhei',fontSize=12,leading=14,spaceBefore=12,spaceAfter=6))
	#定义容器
	story = []
	#添加内容,样式是标题
	story.append(Paragraph("分析报告", stylesheet['titledef']))
	#添加内容,样式是段落标题
	story.append(Paragraph(u"一、主题概览", stylesheet['head1def']))
	#添加图片
	story.append('图片地址')
	#添加普通内容
	story.append(Paragraph('content', stylesheet['simhei']))
	#保存
	doc = SimpleDocTemplate('pdf/filename.pdf')
	doc.build(story,onFirstPage=footer,onLaterPages=footer)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值