如何自己写代码从pdf文件中提取纯文本

问题描述

最近做一个毕设,关于从pdf文件中提取纯文本的。从网上找了一段C写的代码,可以简单的实现从pdf中抽取文本,不过,只能提取英文,而不能提取汉字。研究了几天了,仍无头绪,急求大侠帮忙。下面附上c语言代码。#include<stdio.h>#include<windows.h>//YOurprojectmustalsoincludezdll.lib(ZLIB)asadependency.//ZLIBcanbefreelydownloadedfromtheinternet,www.zlib.org//Use4bytestructalignmentinyourproject!#include"zlib.h"#include<tchar.h>//Findastringinabuffer:size_tFindStringInBuffer(char*buffer,char*search,size_tbuffersize){char*buffer0=buffer;size_tlen=strlen(search);boolfnd=false;while(!fnd){fnd=true;for(size_ti=0;i<len;i++){if(buffer[i]!=search[i]){fnd=false;break;}}if(fnd)returnbuffer-buffer0;buffer=buffer+1;if(buffer-buffer0+len>=buffersize)return-1;}return-1;}//Keepthismanypreviousrecentcharactersforbackreference:#defineoldchar15//Convertarecentsetofcharactersintoanumberifthereisone.//Otherwisereturn-1:floatExtractNumber(constchar*search,intlastcharoffset){inti=lastcharoffset;while(i>0&&search[i]=='')i--;while(i>0&&(isdigit(search[i])||search[i]=='.'))i--;floatflt=-1.0;charbuffer[oldchar+5];ZeroMemory(buffer,sizeof(buffer));strncpy(buffer,search+i+1,lastcharoffset-i);if(buffer[0]&&sscanf(buffer,"%f",&flt)){returnflt;}return-1.0;}//Checkifacertain2charactertokenjustcamealong(e.g.BT):boolseen2(constchar*search,char*recent){if(recent[oldchar-3]==search[0]&&recent[oldchar-2]==search[1]&&(recent[oldchar-1]==''||recent[oldchar-1]==0x0d||recent[oldchar-1]==0x0a)&&(recent[oldchar-4]==''||recent[oldchar-4]==0x0d||recent[oldchar-4]==0x0a)){returntrue;}returnfalse;}//ThismethodprocessesanuncompressedAdobe(text)objectandextractstext.voidProcessOutput(FILE*file,char*output,size_tlen){//Arewecurrentlyinsideatextobject?//FILE*fText=fopen("c:\output2.txt","a+");//for(size_ti=0;i<len;i++){//fputc(output[i],fText);//}//fclose(fText);boolintextobject=false;//Isthenextcharacterliteral(e.g.\togetacharacteror(toget():boolnextliteral=false;//()Bracketnestinglevel.Textappearsinside()intrbdepth=0;//Keeppreviouscharstogetextractnumbersetc.:charoc[oldchar];intj=0;for(j=0;j<oldchar;j++)oc[j]='';for(size_ti=0;i<len;i++){charc=output[i];if(intextobject){if(rbdepth==0&&seen2("TD",oc)){//Positioning.//Seeifanewlinehastostartorjustatab:floatnum=ExtractNumber(oc,oldchar-5);if(num>1.0){fputc(0x0d,file);fputc(0x0a,file);}if(num<1.0){fputc('t',file);}}if(rbdepth==0&&seen2("ET",oc)){//Endofatextobject,alsogotoanewline.intextobject=false;fputc(0x0d,file);fputc(0x0a,file);}elseif(c=='('&&rbdepth==0&&!nextliteral){//Startoutputtingtext!rbdepth=1;//Seeifaspaceortab(>1000)iscalledforbylooking//atthenumberinfrontof(intnum=ExtractNumber(oc,oldchar-1);if(num>0){if(num>1000.0){fputc('t',file);}elseif(num>100.0){fputc('',file);}}}elseif(c==')'&&rbdepth==1&&!nextliteral){//Stopoutputtingtextrbdepth=0;}elseif(rbdepth==1){//Justanormaltextcharacter:if(c=='\'&&!nextliteral){//Onlyprintoutnextcharacternomatterwhat.Donotinterpret.nextliteral=true;}else{nextliteral=false;if(((c>='')&&(c<='~'))||((c>=128)&&(c<255))){fputc(c,file);}}}}//Storetherecentcharactersforwhenwehavetogobackforanumber:for(j=0;j<oldchar-1;j++)oc[j]=oc[j+1];oc[oldchar-1]=c;if(!intextobject){if(seen2("BT",oc)){//Startofatextobject://printf("存在文字!n");intextobject=true;}}}}int_tmain(intargc,_TCHAR*argv[]){//Discardexistingoutput:FILE*fileo=fopen("c:\pdf\output2.txt","w");if(fileo)fclose(fileo);fileo=fopen("c:\pdf\output2.txt","a");intflag=2;//OpenthePDFsourcefile:FILE*filei=fopen("c:\pdf\123.pdf","rb");if(filei&&fileo){//Getthefilelength:intfseekres=fseek(filei,0,SEEK_END);//fseek==0ifoklongfilelen=ftell(filei);fseekres=fseek(filei,0,SEEK_SET);//Readethentirefileintomemory(!):char*buffer=newchar[filelen];ZeroMemory(buffer,filelen);size_tactualread=fread(buffer,filelen,1,filei);//mustreturn1boolmorestreams=true;//Nowsearchthebufferrepeatedforstreamsofdata:while(morestreams){//Searchforstream,endstream.Weoughttofirstcheckthefilter//oftheobjecttomakesureitifFlateDecode,butskipthatfornow!size_tstreamstart=FindStringInBuffer(buffer,"stream",filelen);size_tstreamend=FindStringInBuffer(buffer,"endstream",filelen);//printf("streamstart=%u,streamend=%un",streamstart,streamend);//test//if(flag==2){//test//flag++;//size_tstringstart=FindStringInBuffer(buffer,"stream",filelen);//for(inttemp=0;temp<6;temp++){//printf("c=%cn",buffer[stringstart+temp]);//}//}if(streamstart>0&&streamend>streamstart){//Skiptobeginningandendofthedatastream:streamstart+=6;if(buffer[streamstart]==0x0d&&buffer[streamstart+1]==0x0a)streamstart+=2;elseif(buffer[streamstart]==0x0a)streamstart++;if(buffer[streamend-2]==0x0d&&buffer[streamend-1]==0x0a)streamend-=2;elseif(buffer[streamend-1]==0x0a)streamend--;//Assumeoutputwillfitinto10timesinputbuffer:size_toutsize=(streamend-streamstart)*10;char*output=newchar[outsize];ZeroMemory(output,outsize);//Nowusezlibtoinflate:z_streamzstrm;ZeroMemory(&zstrm,sizeof(zstrm));zstrm.avail_in=streamend-streamstart+1;zstrm.avail_out=outsize;zstrm.next_in=(Bytef*)(buffer+streamstart);zstrm.next_out=(Bytef*)output;intrsti=inflateInit(&zstrm);if(rsti==Z_OK){intrst2=inflate(&zstrm,Z_FINISH);if(rst2>=0){//Ok,gotsomething,extractthetext:size_ttotout=zstrm.total_out;ProcessOutput(fileo,output,totout);}}delete[]output;output=0;buffer+=streamend+7;filelen=filelen-(streamend+7);}else{morestreams=false;}}fclose(filei);}if(fileo)fclose(fileo);return0;}

解决方案

解决方案二:
请问现在解决了吗???我现在也碰到这问题了!!!
解决方案三:
问题如何解决的??能给点指示吗??小弟也遇到的此问题,急呀!
解决方案四:
楼主好淫,求公布解决方案~
解决方案五:
好吧,我这两天整理一下,将源码及解决过程发一下
解决方案六:
学习一下,完全不会
解决方案七:
楼主,问题解决了吗?小弟也遇到的此问题,能给点提示吗???
解决方案八:
楼主,zlib.h的代码分享一下吧,谢谢了
解决方案九:
求楼主公布解决方式~~~小弟谢谢了
解决方案十:
请问你下楼主解决这个问题了没有啊
解决方案十一:
大神源码何在呀
解决方案十二:
这就相当于程序自动识别验证码一样,唯一的优点是没有图片没有加干扰。。。你需要一个样本图像库来进行识别每个汉字学习下Tesseract,比较初级的识别引擎

时间: 2024-11-03 03:01:57

如何自己写代码从pdf文件中提取纯文本的相关文章

c-如何用C语言编写代码实现:文件中一行的开头是否与正则表达式^$w_ang[.* 相匹配

问题描述 如何用C语言编写代码实现:文件中一行的开头是否与正则表达式^$w_ang[.* 相匹配 如何用C语言编写代码实现:文件中一行的开头是否与正则表达式^$w_ang[.* 相匹配,,,怎么写代码啊,,求大神们指点,,万分感谢!!!! 解决方案 正则表达式应该可以看做是字符串匹配吧

angularjs-angularJS写法问题。ng-click等元素事件,能否像jquery一样写到外部js文件中。

问题描述 angularJS写法问题.ng-click等元素事件,能否像jquery一样写到外部js文件中. 如jquery中,HTML页面中DOM元素不需要写事件代码,可以直接把代码写到JS文件中, $("#aaa").on({ click:function(){}, mouseover:function(){} }); $(document).on("click","#aaa",function(){}); 并且同一个事件可以绑定多个方法,请

C#怎么解析PDF文件中的线段之类的图元?

问题描述 各位,我想解析PDF文件中的图形,网上有一大堆都是读取pdf文件里面的文字,或者顶多是图片之类的.但是我想要的是,读取PDF文件里面的CAD图纸:例如一个圆.一个线段.或者一段弧.其实也就是,想把这个PDF文件经过解析,生成同样的CAD文件.现在的问题就是:怎么获取里面线段.圆.圆弧等图元,获取图元的坐标信息,然后写到CAD文件里面(写到CAD这个很简单).说白了,就是这么把PDF文件里面的内容转换成CAD图纸.网上也有一些工具,但是效果不是很好,有的还是破解的.求助啊~~~~~~~~

struct-结构体初始化问题, 定义了结构体和结构体数组,结构体中想存的数据写在了txt文件中,我该怎么做初始化

问题描述 结构体初始化问题, 定义了结构体和结构体数组,结构体中想存的数据写在了txt文件中,我该怎么做初始化 定义了结构体和结构体数组,结构体中想存的数据写在了txt文件中,我该怎么做初始化//定义结构体//struct achievement{int number; char name[20]; char sex; float achievement1achievement2achievement3;}tab_achievement[N]; 解决方案 写一个循环,从txt中读取数据,然后赋值

struct-结构体初始化问题,想要存入结构体中的数据写在了txt文件中,这样写可以实现初始化吗

问题描述 结构体初始化问题,想要存入结构体中的数据写在了txt文件中,这样写可以实现初始化吗 //定义结构体//struct achievement{int number; char name[20]; char sex; float achievement1achievement2achievement3;}tab_achievement[N]; //读出文件函数//void read() {FILE *fp;int in;if((fp=fopen(""C:UsersAdminist

vb.net 如何读取PDF文件中的图像。

问题描述 如题,我想用vb.net读取PDF文件中的一个图片,并在窗体上的图片框中显示出来.我的PDF文件里只有一张图片,别的什么都没有.新手求各位大侠帮忙..谢谢! 解决方案 解决方案二:有很多pdftoimage控件,有這樣的功能解决方案三:大侠,能传给我一个吗,我在网上没找到.ocx格式的,我想要OCX格式的,不用注册的.谢谢我的邮箱.zhichenShen@163.com

我想知道怎样提取pdf文件中的图片,因为我想把pdf文件转换为doc,还有别的形式,可是利用pdfbox只能提取出文本来,希望大家提供点办法,急呀

问题描述 我想知道怎样提取pdf文件中的图片,因为我想把pdf文件转换为doc,还有别的形式,可是利用pdfbox只能提取出文本来,希望大家提供点办法,急 解决方案 解决方案二:你从网上下载个PDF转化DOC工具就得了啊,很多的,到处都是咧解决方案三:貌似使用adobe的打印到文件就可以转换成doc文件解决方案四:你从网上下载个PDF转化DOC工具

pdf-如何在一个PDF文件中划线,划好之后保存,用的是C/C++,windows环境,请问用什么开发库?

问题描述 如何在一个PDF文件中划线,划好之后保存,用的是C/C++,windows环境,请问用什么开发库? 在线等,请各位大神帮忙,谢谢!在线等,请各位大神帮忙,谢谢! 解决方案 学习PDF文件结构,然后读写文件,自己实现.自己动手,丰衣足食~~ 解决方案二: http://blog.csdn.net/wangjie0377/article/details/7163370

vb.net 数据库 从txt文件中提取数据显示在数据库上

问题描述 vb.net 数据库 从txt文件中提取数据显示在数据库上 哪位大神帮我写个简单代码,从txt文件中提取数据,然后显示在数据库中,并且修改之后又可以保存在txt中,可以一起商量写.会有相当酬劳.联系我qq1184218831 解决方案 File.ReadAllLines(你的文本文件) 这样就可以读取到数组中 然后用Split分割列. 解决方案二: 文本中的数据不规则,是通过先查找,做成数组,在显示到数据里,如果你会做,我能加你qq,咨询你吗? 解决方案三: 用正则表达式去过滤.