Răsfoiți Sursa

Added ability to get a page by its number after they've been created (#136)

* Added ability to get a page by its number after they've been created
Andre Renaud 2 ani în urmă
părinte
comite
af5f30ac5f
3 a modificat fișierele cu 35 adăugiri și 3 ștergeri
  1. 18 0
      pdfgen.c
  2. 11 0
      pdfgen.h
  3. 6 3
      tests/main.c

+ 18 - 0
pdfgen.c

@@ -860,6 +860,24 @@ struct pdf_object *pdf_append_page(struct pdf_doc *pdf)
     return page;
 }
 
+struct pdf_object *pdf_get_page(struct pdf_doc *pdf, int page_number)
+{
+    if (page_number <= 0) {
+        pdf_set_err(pdf, -EINVAL, "page number must be >= 1");
+        return NULL;
+    }
+
+    for (struct pdf_object *obj = pdf_find_first_object(pdf, OBJ_page); obj;
+         obj = obj->next, page_number--) {
+        if (page_number == 1) {
+            return obj;
+        }
+    }
+
+    pdf_set_err(pdf, -EINVAL, "no such page");
+    return NULL;
+}
+
 int pdf_page_set_size(struct pdf_doc *pdf, struct pdf_object *page,
                       float width, float height)
 {

+ 11 - 0
pdfgen.h

@@ -383,6 +383,17 @@ float pdf_page_width(const struct pdf_object *page);
  */
 struct pdf_object *pdf_append_page(struct pdf_doc *pdf);
 
+/**
+ * Retrieve a page by its number.
+ *
+ * Note: The page must have already been created via \ref pdf_append_page
+ *
+ * @param pdf PDF document to get page from
+ * @param page_number Page number to retrieve, starting from 1.
+ * @return Page object if the given page is found, NULL otherwise
+ */
+struct pdf_object *pdf_get_page(struct pdf_doc *pdf, int page_number);
+
 /**
  * Adjust the width/height of a specific page
  * @param pdf PDF document that the page belongs to

+ 6 - 3
tests/main.c

@@ -22,7 +22,7 @@ int main(int argc, char *argv[])
                             .author = "My name",
                             .subject = "My subject"};
     struct pdf_doc *pdf = pdf_create(PDF_A4_WIDTH, PDF_A4_HEIGHT, &info);
-    struct pdf_object *first_page;
+    struct pdf_object *first_page, *second_page;
     int i;
     float height, width;
     int bm;
@@ -81,7 +81,8 @@ int main(int argc, char *argv[])
     /* From now on, we shouldn't see any errors */
 
     pdf_set_font(pdf, "Times-BoldItalic");
-    first_page = pdf_append_page(pdf);
+    pdf_append_page(pdf);
+    first_page = pdf_get_page(pdf, 1);
 
     pdf_add_text_wrap(
         pdf, NULL,
@@ -157,7 +158,9 @@ int main(int argc, char *argv[])
     pdf_add_bookmark(pdf, NULL, -1, "First page");
 
     pdf_append_page(pdf);
-    pdf_add_text(pdf, NULL, "Page Two", 10, 20, 30, PDF_RGB(0, 0, 0));
+    second_page = pdf_get_page(pdf, 2);
+
+    pdf_add_text(pdf, second_page, "Page Two", 10, 20, 30, PDF_RGB(0, 0, 0));
     pdf_add_text(pdf, NULL, "This is some weird text () \\ # : - Wi-Fi 27°C",
                  10, 50, 60, PDF_RGB(0, 0, 0));
     pdf_add_text(