#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "pdflib.h"
#define LPDF_INVALID_OBJECT 0x1033
static char pdf_buf[512];
#define LPDF_VERSIOIN_TEXT "0.0.1"
#define LPDF_FILE_HEADER_LEN 15
#define LPDF_BASEFONT_NUM 14
const char LPDF_FILE_HEADER[] = "%%PDF-1.4\n%%\xAA\xBB\xCC\xDD\n";
const char *font_list[] = {
"Courier",
"Courier-Bold",
"Courier-Oblique",
"Courier-BoldOblique",
"Helvetica",
"Helvetica-Bold",
"Helvetica-Oblique",
"Helvetica-BoldOblique",
"Times-Roman",
"Times-Bold",
"Times-Italic",
"Times-BoldItalic",
"Symbol",
"ZapfDingbats",
NULL
};
const char * LPDF_GetVersion(void)
{
return LPDF_VERSIOIN_TEXT;
}
LPDF_Doc LPDF_New(void)
{
static LPDF_Doc_Rec pdf;
LPDF_INT length = 0, i = 0;
LPDF_UINT writeBytes = 0;
FRESULT fr;
fr = LPDF_FOPEN(&pdf.file,"/tmp.pdf",FA_CREATE_ALWAYS|FA_WRITE);
if(fr)
{
LPDF_PRINTF("create tmp.pdf failed!\r\n");
return NULL;
}
LPDF_FPRINTF(&pdf.file,LPDF_FILE_HEADER); /* 写入文件头 */
pdf.offset = LPDF_FILE_HEADER_LEN;
pdf.obj[0].objIdx = pdf.offset;
length = LPDF_SPRINTF(pdf_buf,"1 0 obj\n<<\n/Type /Catalog\n/Pages 17 0 R\n>>\nendobj\n\n");
LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);
pdf.offset += length;
pdf.obj[1].objIdx = pdf.offset;
length = LPDF_SPRINTF(pdf_buf,"2 0 obj\n<<\n/Creator (light pdf library 0.0.1)\n"
"/Auther (anobodykey)\n>>\nendobj\n\n");
LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);
pdf.offset += length;
for(i = 0; i < LPDF_BASEFONT_NUM-2; i++)
{
pdf.obj[2+i].objIdx = pdf.offset;
length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<<\n/Type /Font\n/Subtype /Type1\n"
"/BaseFont /%s\n/Encoding /WinAnsiEncoding\n>>\n"
"endobj\n\n",3+i,font_list[i]);
LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);
pdf.offset += length;
}
for(; i < LPDF_BASEFONT_NUM; i++)
{
pdf.obj[2+i].objIdx = pdf.offset;
length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<<\n/Type /Font\n/Subtype /Type1\n"
"/BaseFont /%s\n>>\nendobj\n\n",3+i,font_list[i]);
LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);
pdf.offset += length;
}
pdf.objNumber = 3+i;
return (LPDF_Doc)&pdf;
}
LPDF_STATUS LPDF_SaveToFile(LPDF_Doc pdf,const char *file_name)
{
LPDF_UINT16 i = 0, child_pages = 0;
LPDF_INT length = 0;
LPDF_UINT writeBytes = 0;
pdf->obj[16].objIdx = pdf->offset;
child_pages = (pdf->objNumber-2-LPDF_BASEFONT_NUM)/3 ;
length = LPDF_SPRINTF(pdf_buf,"17 0 obj\n<<\n/Types /Pages\n/Count %d\n/Kids [ ",child_pages);
LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
pdf->offset += length;
for(i = 0; i < child_pages; i++)
{
length = LPDF_SPRINTF(pdf_buf,"%d 0 R\n",18+i*3);
LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
pdf->offset += length;
}
length = LPDF_SPRINTF(pdf_buf,"]\n>>\nendobj\n\n");
LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
pdf->offset += length;
LPDF_FPRINTF(&pdf->file,"xref\n0 %d\n0000000000 65535 f\r\n",pdf->objNumber+1);
for(i = 0 ; i < pdf->objNumber; i++)
{
LPDF_FPRINTF(&pdf->file,"%10.10d 00000 n\r\n",pdf->obj[i].objIdx);
}
LPDF_FPRINTF(&pdf->file,"trailer\n<<\n/Size %d\n/Root 1 0 R\n/Info 2 0 R\n>>\nstartxref\n%d\n%%%%EOF",
pdf->objNumber+1,pdf->offset);
LPDF_FCLOSE(&pdf->file);
LPDF_REMOVE(file_name);
LPDF_RENAME("tmp.pdf",file_name);
return LPDF_OK;
}
LPDF_STATUS LPDF_Free(LPDF_Doc pdf)
{
memset(pdf,sizeof(LPDF_Doc_Rec),0);
return LPDF_OK;
}
LPDF_Page LPDF_AddPage(LPDF_Doc pdf)
{
LPDF_INT length = 0,i = 0;
LPDF_Page page = NULL;
LPDF_UINT writeBytes = 0;
pdf->obj[pdf->objNumber].objIdx = pdf->offset;
length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<<\n/Type /Page\n/Parent 4 0 R\n/Contents %d 0 R\n"
"/Resources <<\n/ProcSet [/PDF /TEXT /ImageB /ImageC /ImageI]\n"
"/Font <<\n",pdf->objNumber+1,pdf->objNumber+2);
LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
pdf->offset += length;
while(font_list[i])
{
length = LPDF_SPRINTF(pdf_buf,"/F%d %d 0 R\n",i+1,3+i);
LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
pdf->offset += length;
i+=1;
}
LPDF_FPRINTF(&pdf->file,">>\n>>\n");
pdf->offset += 4;
page = (LPDF_Page)&pdf->obj[pdf->objNumber];
page->width = 595;
page->height = 842;
page->gMode = LPDF_GMODE_INVALID;
page->fontType = LPDF_FONT_INVALID;
page->doc = pdf;
return page;
}
LPDF_STATUS LPDF_Page_SetHeight(LPDF_Page page, LPDF_UINT16 value)
{
page->height = value;
return LPDF_OK;
}
LPDF_STATUS LPDF_Page_SetWidth(LPDF_Page page, LPDF_UINT16 value)
{
page->width = value;
return LPDF_OK;
}
LPDF_UINT16 LPDF_Page_GetHeight(LPDF_Page page)
{
if(page)
{
return page->height;
}
return LPDF_OK;
}
LPDF_UINT16 LPDF_Page_GetWidth(LPDF_Page page)
{
if(page)
{
return page->width;
}
return LPDF_OK;
}
LPDF_STATUS LPDF_Page_CheckState(LPDF_Page page, LPDF_UINT mode)
{
if(!page)
return LPDF_INVALID_OBJECT;
if(!(page->gMode&mode))
return LPDF_FAILED;
return LPDF_OK;
}
LPDF_STATUS LPDF_Page_SetFontAndSize(LPDF_Page page,
const char *font_name, LPDF_UINT8 size)
{
LPDF_Doc pdf = (LPDF_Doc)page->doc;
LPDF_INT i = 0,length = 0;
LPDF_UINT writeBytes = 0;
LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT|LPDF_GMODE_PAGE_DESCRIPTION);
if(LPDF_OK != ret)
return ret;
while(font_list[i])
{
if(0 == strcmp(font_list[i],font_name))
{
page->fontType = i;
page->fontSize = size;
length = LPDF_SPRINTF(pdf_buf,"/F%d %d Tf\n",i+1,size);
LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
pdf->offset += length;
page->length += length;
return LPDF_OK;
}
i+=1;
}
return LPDF_OK;
}
LPDF_STATUS LPDF_Page_SaveParams(LPDF_Page page)
{
LPDF_INT length;
LPDF_UINT writeBytes = 0;
LPDF_Doc pdf = (LPDF_Doc)page->doc;
LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_INVALID);
if(LPDF_OK != ret)
return ret;
/* 对于每个page来说该接口只能调用一次即在GMODE为INVALID的模式下 */
length = LPDF_SPRINTF(pdf_buf,"/MediaBox [ 0 0 %d %d ]\n>>\nendobj\n\n",
page->width, page->height);
LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
pdf->offset += length;
pdf->obj[pdf->objNumber+1].objIdx = pdf->offset;
length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<</Length %d 0 R>>\nstream\n",
pdf->objNumber+2, pdf->objNumber+3);
LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
pdf->offset += length;
page->length = 0;
page->gMode = LPDF_GMODE_PAGE_DESCRIPTION;
return LPDF_OK;
}
LPDF_STATUS LPDF_Page_SaveContext(LPDF_Page page)
{
LPDF_INT length;
LPDF_UINT writeBytes = 0;
LPDF_Doc pdf = (LPDF_Doc)page->doc;
LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PAGE_DESCRIPTION);
if(LPDF_OK != ret)
return ret;
/* 对于每个page来说该接口只能调用一次即在GMODE为PAGE_DESCRIPTION的模式下 */
length = LPDF_SPRINTF(pdf_buf,"endstream\nendobj\n\n");
LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
pdf->o
评论6
最新资源