2014-08-28 58 views
0

我正在生成pdf报告问题是我不知道报告的页数会有多少。我需要动态创建一个页面,因为它们需要它,我尝试这个,但它不起作用。在libharu中动态添加页面C

//page counter 
int page_num=1; 

HPDF_Doc pdf; 
HPDF_Page *page; 
char fname[256]; 
HPDF_Destination dst; 
//This works for the first page 
page = malloc(sizeof(*page)); 
if (page==NULL) { 
    printf("Error allocating memory!\n"); //print an error message 
} else { 
    printf("allocation successful\n"); 
} 

,我能写的pdf文件正常,但是当我尝试创建另一页 我得到一个分段错误。我尝试这样。

page_num ++; 
HPDF_Page *temp; 
*temp = realloc(page, (page_num+2) * sizeof(page)); 
if (temp != NULL) //realloc was successful 
{ 
page = temp; 
page[page_num] = HPDF_AddPage (pdf); //** This line makes it crash **// 

printf("Success Reallocating into page\n"); 
} 
else //there was an error 
{ printf("Error reallocating into page\n"); } 

我试图做这样的,因为我需要回到一个特定的页面并插入页码例如,“第1页50”页脚如果有一个不同的方式来实现这一目标让我知道。在他们的网站上也有一个例子,它有多个页面,但是这是在一开始就设置了一些不适合我的页面。

回答

0

* temp = realloc(page,(page_num + 2)* sizeof(page))此错误。页面是地址点,sizeof(页面)是8

+0

好吧,那我该如何解决它? – 2014-09-02 16:19:01

+0

* temp = realloc(page,(page_num + 2)* sizeof(* page));或* temp = realloc(page,(page_num + 2)* sizeof(HPDF_Page)); – 2014-09-03 01:10:04

0

看看type definition HPDF_Page
HPDF_Page p;
p是指针

HPDF_Page *p;
* P现在是双指针

malloc的内存分配:

HPDF_Page *page; //this is double pointer!!!! 

page = malloc(number_of_pages * sizeof(HPDF_Page*)); // memory allocation for array of pointers 
if(page) 
{ 
    for(i = 0; i < number_of_pages; i++) 
    { 
     page[i] = malloc(sizeof(HPDF_Page)); // allocation for each page pointer 
     page[i] = HPDF_AddPage (pdf); 
    } 
} 

realloc的内存分配:

number_of_pages++; 
page = realloc(page, number_of_pages * sizeof(HPDF_Page*)); 

if(page) 
{ 
     page[number_of_pages-1] = malloc(sizeof(HPDF_Page)); 
     page[number_of_pages-1] = HPDF_AddPage (pdf); 
} 


Malloc将工作。但realloc将无法正常工作,程序将失败!我不知道为什么。工作方法是使用链表:

struct my_ch 
{ 
    struct my_ch *n; 
    struct my_ch *p; 
    HPDF_Page page; 
    int page_number; 
}*f_item = NULL, *l_item = NULL; 

void add_item() 
{ 
    struct my_ch *pom; 
    pom = f_item; 

    if(pom) 
    { 
     struct my_ch *prev; 

     while(pom->n) 
     { 
      pom = pom->n; 
     } 

     prev = pom; 
     pom->n = malloc(sizeof(struct my_ch)); 
     pom = pom->n; 
     pom->p = prev; 
     pom->n = NULL; 
     pom->page = malloc(sizeof(HPDF_Page)); 
     pom->page_number = pom->prev->page_number + 1; 
    } 
    else 
    { 
     pom = malloc(sizeof(struct my_ch)); 
     pom->p = NULL; 
     pom->n = NULL; 
     pom->page = malloc(sizeof(HPDF_Page)); 
     pom->page_number = 1; 
    } 

    l_item = pom; 
} 

void add_my_new_page() 
{ 
    add_item(); 
    l_item->page = HPDF_AddPage(pdf); 
    //paste some nice graphic, text... 
} 

bool modify_page(int number_of_page) 
{ 
    struct my_ch *p; 
    p = f_item; 

    while(p) 
    { 
     if(p->page_number == number_of_page) 
     { 
      // let`s do some modifycation on p->page 
      HPDF_Page_Rectangle(p->page, ..., ...); 
      HPDF_Page_Stroke(p->page); 

      return true; 
     } 

     p = p->n; 
    } 

    return false; 
} 


我在程序中使用此代码,它工作得很好。