PDF被壓縮了,但從網上看這個壓縮算法就是zlib的壓縮算法,下面的亂碼就是壓縮導致的亂碼,現在需要把這些亂碼復原
%PDF-1.7
%溷弦
4 0 obj
<</Length 3 0 R/Filter/FlateDecode>>
stream
x渆QMK聾}&跉MIb酈Q鰳娵R芻??焱zR<
?|3狣B6?颿f?滕,鞃?珈毿輥紆拶迨鷚#Ef? B?]蔑!?臘}?嫖?疇滁!鈠?v僣$貇憮b勴72?
溔%f."@4擫忶睵?舊?犼\銭/'S/鱐篖x!籤&鈾'Q:?肶O鷾p罷琑厹T?(?5-
瞪苑趬nf艤].O跧9n悪v駝寏w?W</僰?溏D_櫧{耑`_佄D崣j旮c楣?[?蟒驅 躚7Q
endstream
endobj
3 0 obj
280
endobj
構建一個Win32的應用程序,zlib_test(我用的VS2010)前面已經編譯過zlib了,不知道怎么編譯的zlib static lib的可以前面翻翻看看添加zlib到工程中,就是添加一個靜態庫,把zlib.lib放到你的工程(*.vcxproj所在d)目錄下工程->屬性->配置屬性->鏈接器->輸入->附加依賴項->添加 zlib.lib工程->屬性->配置屬性->VC++目錄->庫目錄 添加$(ProjectDir)工程->屬性->配置屬性->VC++目錄->包含目錄 添加$(ProjectDir)\include在工程目錄下創建include,然后把zlib的.h文件都copy過來不好意思,剛發現zlib中有例子不用創建工程了直接用解壓好的‘解決方案'中的testzlib,SourceFile中有testzlib.c,里面就是個壓縮和解壓的例子。代碼我貼下 ,別害怕,這是我在原來代碼的基礎上改的,真正用的代碼很少,看后面
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>#include "zlib.h"void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
{R->HighPart = A.HighPart - B.HighPart;if (A.LowPart >= B.LowPart)R->LowPart = A.LowPart - B.LowPart;else{R->LowPart = A.LowPart - B.LowPart;R->HighPart --;}
}#ifdef _M_X64
// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
unsigned __int64 __rdtsc(void);
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{// printf("rdtsc = %I64x\n",__rdtsc());pbeginTime64->QuadPart=__rdtsc();
}LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{LARGE_INTEGER LIres;unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));LIres.QuadPart=res;// printf("rdtsc = %I64x\n",__rdtsc());return LIres;
}
#else
#ifdef _M_IX86
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
{DWORD dwEdx,dwEax;_asm{rdtscmov dwEax,eaxmov dwEdx,edx}pbeginTime64->LowPart=dwEax;pbeginTime64->HighPart=dwEdx;
}void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{myGetRDTSC32(pbeginTime64);
}LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{LARGE_INTEGER LIres,endTime64;myGetRDTSC32(&endTime64);LIres.LowPart=LIres.HighPart=0;MyDoMinus64(&LIres,endTime64,beginTime64);return LIres;
}
#else
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
{
}void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{
}LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{LARGE_INTEGER lr;lr.QuadPart=0;return lr;
}
#endif
#endifvoid BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
{if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64))){pbeginTime64->LowPart = GetTickCount();pbeginTime64->HighPart = 0;}
}DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{LARGE_INTEGER endTime64,ticksPerSecond,ticks;DWORDLONG ticksShifted,tickSecShifted;DWORD dwLog=16+0;DWORD dwRet;if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))dwRet = (GetTickCount() - beginTime64.LowPart)*1;else{MyDoMinus64(&ticks,endTime64,beginTime64);QueryPerformanceFrequency(&ticksPerSecond);{ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);}dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));dwRet *=1;}return dwRet;
}int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
{FILE* stream;unsigned char* ptr;int retVal=1;printf("filename = %s\n",filename);stream=fopen(filename, "rb");if (stream==NULL){printf("stream == NULL\n");return 0;}fseek(stream,0,SEEK_END);*plFileSize=ftell(stream);printf("*plFileSize = %d\n",*plFileSize);fseek(stream,0,SEEK_SET);ptr=malloc((*plFileSize)+1);if (ptr==NULL)retVal=0;else{if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))retVal=0;}fclose(stream);*pFilePtr=ptr;return retVal;
}
#if 1int main(int argc, char *argv[])
{const char *uncom_file_name = "uncom.txt";long lFileSize1 = 0;unsigned char * FilePtr = NULL;int err = 0;uLongf uncom_len = 1024;Bytef uncom_buf[1024];memset(uncom_buf,0x00,sizeof(uncom_buf));if(ReadFileMemory(uncom_file_name,&lFileSize1,&FilePtr)==0){printf("error reading %s\n",uncom_file_name);return 1;}else{printf("file %s read ,%d bytes\n",uncom_file_name,lFileSize1);}err = uncompress(uncom_buf,&uncom_len,FilePtr,lFileSize1);printf("uncom_len = %d\n",uncom_len);if (err != Z_OK){printf("err = %d\n",err);return 1;}if(FilePtr != NULL){free(FilePtr);FilePtr = NULL;}printf("uncom_buf = %s\n",uncom_buf);return 0;
}
#else
int main(int argc, char *argv[])
{int BlockSizeCompress=0x8000;int BlockSizeUncompress=0x8000;int cprLevel=Z_DEFAULT_COMPRESSION ;long lFileSize;unsigned char* FilePtr;long lBufferSizeCpr;long lBufferSizeUncpr;long lCompressedSize=0;unsigned char* CprPtr;unsigned char* UncprPtr;long lSizeCpr,lSizeUncpr;DWORD dwGetTick,dwMsecQP;LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;if (argc<=1){printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");return 0;}if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0){printf("error reading %s\n",argv[1]);return 1;}else printf("file %s read, %u bytes\n",argv[1],lFileSize);if (argc>=3)BlockSizeCompress=atol(argv[2]);if (argc>=4)BlockSizeUncompress=atol(argv[3]);if (argc>=5)cprLevel=(int)atol(argv[4]);lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;lBufferSizeUncpr = lBufferSizeCpr;CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);BeginCountPerfCounter(&li_qp,TRUE);dwGetTick=GetTickCount();BeginCountRdtsc(&li_rdtsc);{z_stream zcpr;int ret=Z_OK;long lOrigToDo = lFileSize;long lOrigDone = 0;int step=0;memset(&zcpr,0,sizeof(z_stream));deflateInit(&zcpr,cprLevel);zcpr.next_in = FilePtr;zcpr.next_out = CprPtr;do{long all_read_before = zcpr.total_in;zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);zcpr.avail_out = BlockSizeCompress;ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);lOrigDone += (zcpr.total_in-all_read_before);lOrigToDo -= (zcpr.total_in-all_read_before);step++;} while (ret==Z_OK);lSizeCpr=zcpr.total_out;deflateEnd(&zcpr);dwGetTick=GetTickCount()-dwGetTick;dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);printf("total compress size = %u, in %u step\n",lSizeCpr,step);printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);}CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);BeginCountPerfCounter(&li_qp,TRUE);dwGetTick=GetTickCount();BeginCountRdtsc(&li_rdtsc);{z_stream zcpr;int ret=Z_OK;long lOrigToDo = lSizeCpr;long lOrigDone = 0;int step=0;memset(&zcpr,0,sizeof(z_stream));inflateInit(&zcpr);zcpr.next_in = CprPtr;zcpr.next_out = UncprPtr;do{long all_read_before = zcpr.total_in;zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);zcpr.avail_out = BlockSizeUncompress;ret=inflate(&zcpr,Z_SYNC_FLUSH);lOrigDone += (zcpr.total_in-all_read_before);lOrigToDo -= (zcpr.total_in-all_read_before);step++;} while (ret==Z_OK);lSizeUncpr=zcpr.total_out;inflateEnd(&zcpr);dwGetTick=GetTickCount()-dwGetTick;dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);}if (lSizeUncpr==lFileSize){if (memcmp(FilePtr,UncprPtr,lFileSize)==0)printf("compare ok\n");}return 0;
}
#endif
這是當前用的代碼
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>#include "zlib.h"
int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
{FILE* stream;unsigned char* ptr;int retVal=1;stream=fopen(filename, "rb");if (stream==NULL){printf("stream == NULL\n");return 0;}fseek(stream,0,SEEK_END);*plFileSize=ftell(stream);fseek(stream,0,SEEK_SET);ptr=malloc((*plFileSize)+1);if (ptr==NULL)retVal=0;else{if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))retVal=0;}fclose(stream);*pFilePtr=ptr;return retVal;
}
/*
* 從uncom.txt中讀取內容,然后解壓縮
*/
int main(int argc, char *argv[])
{const char *uncom_file_name = "uncom.txt";long lFileSize1 = 0;unsigned char * FilePtr = NULL;int err = 0;uLongf uncom_len = 1024;Bytef uncom_buf[1024];memset(uncom_buf,0x00,sizeof(uncom_buf));if(ReadFileMemory(uncom_file_name,&lFileSize1,&FilePtr)==0){printf("error reading %s\n",uncom_file_name);return 1;}else{printf("file %s read ,%d bytes\n",uncom_file_name,lFileSize1);}err = uncompress(uncom_buf,&uncom_len,FilePtr,lFileSize1);printf("uncom_len = %d\n",uncom_len);if (err != Z_OK){printf("err = %d\n",err);return 1;}if(FilePtr != NULL){free(FilePtr);FilePtr = NULL;}printf("uncom_buf = %s\n",uncom_buf);return 0;
}
這里有幾種錯誤,先說第一種 uncompress第二個參數 uncom_len 定義為0,這個參數要大于你解壓后的數據,所以你先要估計這這個值的大小,這個定義為0的情況下會報錯為 Z_DATA_ERROR第二種錯誤,還是第二個參數定義的過小,比如我這里剛開始定義了大小是512,太TM巧了,我的解壓縮的數據最后發現是513的大小。。。如果這里定義太小會報錯為Z_BUF_ERROR,當然網上說這個變量定義的類型不對也會報這個錯誤,我沒試過第三種錯誤,出現運行時候崩潰,看下堆棧信息是報錯在inflate_fast中,在匯編中,嘗試了這位兄弟的方法zlib uncompress解壓數據inflate_fast函數出錯的解決辦法,是可行的。要注意的是,對應的匯編的函數名字改的話要改全,改完之后還需要手動去刪除contrib\masmx86 下的inffas32.lst 和inffas32.obj 點擊解決方案,重新生成,下面是我解壓出來的數據
q
1 0 0 1 50 700 cm
BT
/F0 24 Tf
0 0 Td
[( )20( )]TJ
ET
Q
q
BT
/F0 24 Tf
0 TL
50 676 Td
( \n \r \r \r )Tj
0 -24 Td
( \n \r \n )Tj
0 -24 Td
( \r \n \n \n )Tj
0 -24 Td
[( \r )20( \n \r )]TJ
0 -24 Td
[( \r \r )20( \n )20( )]TJ
ET
Q
有問題歡迎留言
總結
以上是生活随笔為你收集整理的zlib解压 被压缩的PDF(关键字FlateDecode)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。