file-pdf patch

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all!

Just wanted to share a litte patch for file-pdf.c to support a max width/height and a page number as parameters. 
Maybe someone can clean the code and push it into the next gimp release.

Usage:
gimp -i -b '(pdftojpg inputfilename maxWidth maxHeight outputfilename quality radius delta brightness contrast page)' -b '(gimp-quit 0)'
Example:
gimp -i -b '(pdftojpg "/tmp/input.pdf" 1000 1800 "/tmp/output.jpg" 0.85 3.5 15 -10 5 3)' -b '(gimp-quit 0)'

Have fun,
Thomas

-- 
Thomas Frieling
http://www.kaufda.de
Juno Internet GmbH
Geschäftsführer

Tel.: +49 (0) 30 / 253-293-25
Mobil: + 49 (0) 173 / 63 62 62 3
thomas.frieling@xxxxxxxxx

https://www.xing.com/profile/Thomas_Frieling2

Sitz des kaufDA Office:
Kunsthaus Lempertz, Poststr. 21-22, 10178 Berlin

Sitz der Gesellschaft:
Fronhoferstr. 6, 12165 Berlin

Amtsgericht Charlottenburg - HRB 115393 B
Geschäftsführung: Cihan Aksakal, Thomas Frieling, Christian W. Gaiser, Tim M. Marbach   

*** file-pdf.c	2008-11-20 23:43:49.000000000 +0100
--- file-pdf-patched.c	2009-05-07 16:51:02.000000000 +0200
***************
*** 264,271 ****

    static const GimpParamDef thumb_args[] =
    {
!     { GIMP_PDB_STRING,    "filename",     "The name of the file to load"  },
!     { GIMP_PDB_INT32,     "thumb-size",   "Preferred thumbnail size"      }
    };

    static const GimpParamDef thumb_return_vals[] =
--- 264,277 ----

    static const GimpParamDef thumb_args[] =
    {
!     { GIMP_PDB_STRING,    "filename",          "The name of the file to load"  },
!     /* start of patched part to define preferred height and width of thumbnail - by Cihan Aksakal, Nils Mull */
!     { GIMP_PDB_INT32,     "preferred-width",   "Preferred thumbnail width"      },
!     { GIMP_PDB_INT32,     "preferred-height",  "Preferred thumbnail height"      },
!     /* end of patched part to define preferred height and width of thumbnail - by Cihan Aksakal, Nils Mull */
!     /* start of patched part to define page number to extract - by Cihan Aksakal, Nils Mull */
!     { GIMP_PDB_INT32,     "page-number",       "Page Number to extract (Note: 0-Based)"      }
!     /* end of patched part to define page number to extract - by Cihan Aksakal, Nils Mull */
    };

    static const GimpParamDef thumb_return_vals[] =
***************
*** 427,513 ****
      }
    else if (strcmp (name, LOAD_THUMB_PROC) == 0)
      {
!       if (nparams < 2)
!         {
            status = GIMP_PDB_CALLING_ERROR;
!         }
!       else
!         {
            gdouble      width  = 0;
            gdouble      height = 0;
            gdouble      scale;
            gint32       image  = -1;
            GdkPixbuf   *pixbuf = NULL;

            /* Possibly retrieve last settings */
            gimp_get_data (LOAD_PROC, &loadvals);

            doc = open_document (param[0].data.d_string, &error);

!           if (doc)
!             {
!               PopplerPage *page = poppler_document_get_page (doc, 0);
!
!               if (page)
!                 {
!                   poppler_page_get_size (page, &width, &height);
!
!                   g_object_unref (page);
                  }

!               pixbuf = get_thumbnail (doc, 0, param[1].data.d_int32);
                g_object_unref (doc);
-             }
-
-           if (pixbuf)
-             {
-               image = gimp_image_new (gdk_pixbuf_get_width  (pixbuf),
-                                       gdk_pixbuf_get_height (pixbuf),
-                                       GIMP_RGB);
-
-               gimp_image_undo_disable (image);
-
-               layer_from_pixbuf (image, "thumbnail", 0, pixbuf, 0.0, 1.0);
-               g_object_unref (pixbuf);

!               gimp_image_undo_enable (image);
!               gimp_image_clean_all (image);
              }

!           scale = loadvals.resolution / gimp_unit_get_factor (GIMP_UNIT_POINT);

-           width  *= scale;
-           height *= scale;
-
-           if (image != -1)
-             {
- 	      *nreturn_vals = 4;
-
-               values[1].type         = GIMP_PDB_IMAGE;
- 	      values[1].data.d_image = image;
- 	      values[2].type         = GIMP_PDB_INT32;
- 	      values[2].data.d_int32 = width;
- 	      values[3].type         = GIMP_PDB_INT32;
- 	      values[3].data.d_int32 = height;
-             }
-           else
-             {
-               status = GIMP_PDB_EXECUTION_ERROR;
-             }
          }

!     }
!   else
!     {
        status = GIMP_PDB_CALLING_ERROR;
      }

!   if (status != GIMP_PDB_SUCCESS && error)
!     {
        *nreturn_vals = 2;
        values[1].type          = GIMP_PDB_STRING;
        values[1].data.d_string = error->message;
!     }

    values[0].data.d_status = status;
  }
--- 433,568 ----
      }
    else if (strcmp (name, LOAD_THUMB_PROC) == 0)
      {
!       if (nparams < 2) {
            status = GIMP_PDB_CALLING_ERROR;
!       } else {
!       /* start of patched part to define page number to extract - by Cihan Aksakal, Nils Mull */
            gdouble      width  = 0;
            gdouble      height = 0;
            gdouble      scale;
            gint32       image  = -1;
            GdkPixbuf   *pixbuf = NULL;

+           /* calculate page number to extract */
+           gint32       extractionPageNumber  = 0;
+           if (param[3].data.d_int32 > 0) {
+             extractionPageNumber = param[3].data.d_int32;
+           }
            /* Possibly retrieve last settings */
            gimp_get_data (LOAD_PROC, &loadvals);

            doc = open_document (param[0].data.d_string, &error);
+
+           /* check whether the document is loaded and contains enough pages to process the extraction of the defined page */
+           if (doc && poppler_document_get_n_pages(doc) > extractionPageNumber) {
+             /* added var extractionPageNumber instead of 0 - now it extracts the defined page */
+             PopplerPage *page = poppler_document_get_page (doc, extractionPageNumber);
+             if (page) {
+               poppler_page_get_size (page, &width, &height);
+               g_object_unref (page);
+             }

!             /* calculate prefered size */
!             if (param[1].data.d_int32 > 0 && param[2].data.d_int32 > 0) {
!               /* calculate preferred width and height */
!               gint32 preferredSize = 0;
!
! 	      gint32 bbWidth = param[1].data.d_int32;
! 	      gint32 bbHeight = param[2].data.d_int32;
!
!               gdouble pWidth = 0;
!               gdouble pHeight = 0;
!
!               /* calculation for image scaling & preferredSize */
!               if (width > height) {
!                 printf("width > height\n");
!                 pWidth = bbWidth;
!                 pHeight = (gdouble) (pWidth/width) * height;
!                 printf("%f x %f\n", pWidth, pHeight);
!                 if (pHeight > bbHeight) {
!                   printf("pHeight (%f) > bbHeight (%d)\n", pHeight, bbHeight);
!                   pWidth = (gdouble) (bbHeight/pHeight) * pWidth; // check
!                   pHeight = bbHeight;
!                   printf("%f x %f\n", pWidth, pHeight);
                  }
+               } else {
+                 printf("width =< height\n");
+                 pHeight = bbHeight;
+                 pWidth = (gdouble) (pHeight/height) * width;
+                 printf("%f x %f\n", pWidth, pHeight);
+                 if (pWidth > bbWidth) {
+                   printf("pWidth (%f) > bbWidth (%d)\n", pWidth, bbWidth);
+                   pHeight = (gdouble) (bbWidth/pWidth) * pHeight; // check
+                   pWidth = bbWidth;
+                   printf("%f x %f\n", pWidth, pHeight);
+                 }
+               }
+               preferredSize = MAX(pWidth, pHeight);

!               /* added var extractionPageNumber instead of 0 - now it extracts the defined page */
!               pixbuf = get_thumbnail (doc, extractionPageNumber, preferredSize);
                g_object_unref (doc);

!               if (pixbuf) {
!                 image = gimp_image_new (gdk_pixbuf_get_width  (pixbuf),
!                                         gdk_pixbuf_get_height (pixbuf),
!                                         GIMP_RGB);
!
!                 gimp_image_undo_disable (image);
!
!                 layer_from_pixbuf (image, "thumbnail", 0, pixbuf, 0.0, 1.0);
!                 g_object_unref (pixbuf);
!
!                 gimp_image_undo_enable (image);
!                 gimp_image_clean_all (image);
!               }
!
!               scale = loadvals.resolution / gimp_unit_get_factor (GIMP_UNIT_POINT);
!
!               width  *= scale;
!               height *= scale;
!
!               if (image != -1) {
!   	        *nreturn_vals = 4;
!
!                 values[1].type         = GIMP_PDB_IMAGE;
! 	        values[1].data.d_image = image;
! 	        values[2].type         = GIMP_PDB_INT32;
! 	        values[2].data.d_int32 = width;
! 	        values[3].type         = GIMP_PDB_INT32;
! 	        values[3].data.d_int32 = height;
!               } else {
!                 status = GIMP_PDB_EXECUTION_ERROR;
!               }
!             } else { /* preferred height and width parameters check failed */
!               /* set error message and status that a file page number violation occured */
! 	      g_set_error (&error, 0, 0,
!                            "Could not calculate preferred thumbail height and width (width: '%d', height: '%d' ). Note: Both parameters have to be greater 0. PDF-File: '%s'",
!                            param[1].data.d_int32, param[2].data.d_int32, gimp_filename_to_utf8 (param[0].data.d_string) );
!               status = GIMP_PDB_EXECUTION_ERROR;
              }

!           } else if (doc) { /* check doc & page number failed */
!             /* set error message and status that a file page number violation occured */
! 	    g_set_error (&error, 0, 0,
!             	         "Could not extract page-number %d (Note: 0-Based). Documnent has only %d pages. PDF-File: '%s'",
!                          extractionPageNumber, poppler_document_get_n_pages(doc), gimp_filename_to_utf8 (param[0].data.d_string) );
!             status = GIMP_PDB_EXECUTION_ERROR;
! 	  }
!           /* check doc & page number */

          }
+     /* end of patched part to define page number to extract - by Cihan Aksakal, Nils Mull */

!     } else {
        status = GIMP_PDB_CALLING_ERROR;
      }

!   if (status != GIMP_PDB_SUCCESS && error) {
        *nreturn_vals = 2;
        values[1].type          = GIMP_PDB_STRING;
        values[1].data.d_string = error->message;
!   }

    values[0].data.d_status = status;
  }
_______________________________________________
Gimp-developer mailing list
Gimp-developer@xxxxxxxxxxxxxxxxxxxxxx
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer

[Index of Archives]     [Video For Linux]     [Photo]     [Yosemite News]     [gtk]     [GIMP for Windows]     [KDE]     [GEGL]     [Gimp's Home]     [Gimp on GUI]     [Gimp on Windows]     [Steve's Art]

  Powered by Linux