pdf文件读写

# coding=utf8
import struct
import datetime
import decimal
import itertools
import os
import itertools
from dbfpy import dbf
from dbfrw import *


class DbfLibrary():
    def dbfreader(self, f):
        """Returns an iterator over records in a Xbase DBF file.

        The first row returned contains the field names.
        The second row contains field specs: (type, size, decimal places).
        Subsequent rows contain the data records.
        If a record is marked as deleted, it is skipped.

        File should be opened for binary reads.

        """
        # See DBF format spec at:
        #     http://www.pgts.com.au/download/public/xbase.htm#DBF_STRUCT
        # 读取文件的32个字符,前面4个x表示不需要,后面22x表示不需要,第4-7个字符为记录数,8-9为文件头长度
        numrec, lenheader = struct.unpack('<xxxxLH22x', f.read(32))
        numfields = int((lenheader - 32) / 32)

        fields = []
        for fieldno in xrange(numfields):
            # 读取文件头中每个字段定义32个字符,把每一个字段里面的字段分解成字段名,数据类型,大小,精度
            name, typ, size, deci = struct.unpack('<11sc4xBB14x', f.read(32))
            name = name.replace('\0', '')  # eliminate NULs from string
            fields.append((name, typ, size, deci))

        yield [field[0] for field in fields]
        yield [tuple(field[1:]) for field in fields]
        # 如果包头有结束位,先读取
        if lenheader % 32 == 1:
            terminator = f.read(1)
        # assert terminator == '\r'

        fields.insert(0, ('DeletionFlag', 'C', 1, 0))

        fmt = ''.join(['%ds' % fieldinfo[2] for fieldinfo in fields])
        fmtsiz = struct.calcsize(fmt)
        for i in xrange(numrec):
            record = struct.unpack(fmt, f.read(fmtsiz))
            if record[0] != ' ':
                continue  # deleted record
            result = []
            for (name, typ, size, deci), value in itertools.izip(fields, record):
                if name == 'DeletionFlag':
                    continue
                if typ == "N":
                    # print value
                    value = value.replace('\0', '').lstrip()
                    if value == '':
                        value = 0
                    elif deci:
                        value = value
                    else:
                        value = value
                elif typ == 'D':
                    y, m, d = int(value[:4]), int(value[4:6]), int(value[6:8])
                    value = datetime.date(y, m, d)
                elif typ == 'L':
                    value = (value in 'YyTt' and 'T') or (value in 'NnFf' and 'F') or '?'
                elif typ == 'F':
                    value = float(value)
                result.append(value)
            yield result
        yield lenheader
        # result.append(lenheader)
        # result = result.insert(len(result),str(lenheader))
        # return

 def DbfRead_Dic(self, filename):
        '''
        读取指定DBF库文件的所有数据,并以键值对方法存方数据\n
        filename 为制定路径文件名 'C:/Users/Administrator/Desktop/dbpzhhzxx.dbf' \n
        返回最后一行数据值 ['100888', '3           ', '100888  ', '0', '0689900052', 'D890792572', '20120521']
        '''
        
        f = open(filename, 'rb')
        db = list(self.dbfreader(f))
        cn = len(db)
        f.close()
        # 字段名,字段长度,记录数
        fieldnames, fieldspecs, records = db[0], db[1], db[2:cn - 1]
        lt=[]
        if len(records)>0:
            for i in records:
                dic={}
                for j in range (0,len(i)):
                    dic[fieldnames[j]]=i[j]
                lt.append(dic)
        return lt

    def CreatDbfFile(self,filename, header, content=None,num=32):
        # 打开dbf
        db = dbf.Dbf(filename, new=True)
        # 写列头
        for field in header:
            # 此处需要改成长度可配的,长度太短会导致数据被截断
            if type(field) == unicode:
                field = field.encode('GBK')
            db.addField((field, 'C',num))
        # 写数据
        if content==None:
            content=[[]]
        elif type(content)==str:
            content=eval(content)
        sg=0
        for i in content:#判断是否为双重列表
            if i and type(i)==list:
                sg=sg+1
        if sg==len(content):
            for record in content:
                rec = db.newRecord()
                for key, value in itertools.izip(header, record):
                    if type(value) == unicode:
                        rec[key] = value.encode('GBK')
                    else:
                        rec[key] = value
                    rec.store()
        else:
            rec = db.newRecord()
            for key, value in itertools.izip(header, content):
                if type(value) == unicode:
                    rec[key] = value.encode('GBK')
                else:
                    rec[key] = value
                rec.store()
        # 关闭文档
        db.close()

    def DbfWrite_append(self, filename,content=None,num=32):
        '''
        功能描述:向指定dbf文件内容后追加数据
        入参描述:
        filename dbf文件路径和文件名
         content 如果入参是content=["a","b"]就是在内容后最加一行数据
                如果入参content=[["a","b"],[a,b,c],[d,d,f]],就是依次追加三行数据
         num    设置单元格字符串最长限制
        '''
        if not os.path.exists(filename):
            exit( u"输入路径或文件不存在!"+filename)
        dbf = dbfrw()
        f = open(filename, 'rb')
        db = list(dbf.dbfreader(f))
        cn = len(db)
        f.close()
        # 字段名,字段长度,记录数
        header, fieldspecs, records = db[0], db[1], db[2:cn - 1]
        if content == None:
            content = [[]]
        elif isinstance(content,str)==True:
            content = eval(content)
            if content==[]:
                content = [[]]
        sg =0
        for i in content:  # 判断是否为双重列表
            if isinstance(i,list)==True :
                sg =sg+1
        if sg == len(content) and len(records)>0:
            contents=records+content
            self.CreatDbfFile(filename, header, contents,num)
        elif len(records)>0:
            records.append(content)
            self.CreatDbfFile(filename,header,records,num)
        else:
            self.CreatDbfFile(filename, header, content,num)


# Example calls
ROBOT_LIBRARY_SCOPE = 'GLOBAL'
if __name__ == '__main__':
    a=DbfLibrary()
    filename='C:\\Users\\Administrator\\Desktop\\dbpzhhzxx233.dbf'
    filenamenew = 'C:\\Users\\Administrator\\Desktop\\dbpzhhzxx11.dbf'
    b="['ZQZH','JGBM','ZHMC','ZJLB','ZJBH','ZHZT','LXFS','KHFXDJCPJG','JGBZ']"
    c=['ZQZH','JGBM','ZHMC','ZJLB','ZJBH',0.444,'LXFS','KHFXDJCPJG',2]
    a.DbfWrite_append(filename,c)
    # a.CreatDbfFile(filenamenew,b,c)
    # data = a.DbfRead_Dic(filename)
    # print data
    # b="['ZQZH','JGBM','ZHMC','ZJLB','ZJBH','ZHZT','LXFS','KHFXDJCPJG','JGBZ']"
    # a.DbfLastWrite(filename,b)
    #
    # data=a.DbfRead_Dic(filename)
    # for i in data:
    #     print i['ZHMC'].decode("GBK")
    # '''

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VC是Visual C++的简称,是一种使用C++语言开发Windows操作系统下应用程序的集成开发环境。VC提供了丰富的类库和API,可以方便地实现对不同格式文件的处理,包括读写PDF格式文件。 在VC中,可以使用第三方库或者API来实现对PDF文件的读写操作。常用的库有Adobe Acrobat SDK、iTextSharp等。这些库提供了丰富的功能和接口,可以实现PDF文件的解析、创建、编辑和保存等操作。 首先,我们需要在VC中引入相关的库文件,并设置相应的头文件和链接库。然后通过编程的方式使用库提供的接口来读取或写入PDF文件。 对于读取PDF文件,可以使用库提供的函数来打开PDF文件,获取页面数量、页面内容、文本内容、图像等信息,并进行相应的处理和显示。可以根据需要进行页面排版、文本提取、图片提取等操作。 对于写入PDF文件,可以创建一个空白的PDF文档,并按需求添加页面、文本、图片等内容。可以设置页面大小、背景颜色、字体样式等属性,并保存为PDF文件。 除了使用第三方库,也可以使用VC提供的基础函数和类库来实现对PDF的读写操作。例如,可以使用文件操作函数来读取和写入二进制数据,然后根据PDF文件格式进行解析和处理。 总之,VC可以通过第三方库或者自己实现的方式来实现对PDF文件的读写操作。通过合理选择相应的库和编程方法,可以灵活地满足不同的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值