michaelrsweet / htmldoc

HTML Conversion Software
https://www.msweet.org/htmldoc
GNU General Public License v2.0
209 stars 47 forks source link

Patch to allow image sizes to be specified in "in", "mm", when using --browserwidth {high_dpi} #289

Open michaelrsweet opened 8 years ago

michaelrsweet commented 8 years ago

Version: 1.8-current Original reporter: Iain W. Bird

When using very high browserwidth options, e.g. to allow high DPI background images:

htmldoc --browserwidth 3307 --webpage test2.htm --outfile test2.pdf --size A4 --jpeg=70 --no-title

images become very small unless specified in percent.

This patch allows image sizes to be specified in "in", "mm" or "px" (96DPI). If units are not specified, the pre-existing behaviour is retained.

Use in HTML as follows, e.g.

TEST IMAGE SIZE NATIVE


TEST IMAGE SIZE 80%


TEST IMAGE SIZE 1 INCH

TABLE WIDTH 1in


TEST IMAGE SIZE 2x1 INCH

TABLE WIDTH 2in


TEST IMAGE HEIGHT 50mm


TEST IMAGE WIDTH 144pt


TEST IMAGE WIDTH 12pc


TEST IMAGE WIDTH 530px


TEST IMAGE WIDTH 530


Patch file has been tested under cygwin and MS-VC 2013 for the htmldoc executable

michaelrsweet commented 8 years ago

"htmldoc_imagesize_patch.diff":

Index: htmldoc/http.c
===================================================================
--- htmldoc/http.c  (revision 1736)
+++ htmldoc/http.c  (working copy)
@@ -211,6 +211,7 @@
   return (http);
 }

+#ifndef WIN32

 /*
  * 'httpAddCredential()' - Allocates and adds a single credential to an array.
@@ -246,6 +247,7 @@
   return (-1);
 }

+#endif

 /*
  * 'httpBlocking()' - Set blocking/non-blocking behavior on a connection.
@@ -401,6 +403,7 @@
   free(http);
 }

+#ifndef WIN32

 /*
  * 'httpCompareCredentials()' - Compare two sets of X.509 credentials.
@@ -425,6 +428,7 @@
   return (temp1 == temp2);
 }

+#endif

 /*
  * 'httpConnect()' - Connect to a HTTP server.
@@ -729,6 +733,7 @@
   return ((int)bytes);
 }

+#ifndef WIN32

 /*
  * 'httpFreeCredentials()' - Free an array of credentials.
@@ -753,6 +758,7 @@
   cupsArrayDelete(credentials);
 }

+#endif

 /*
  * 'httpGet()' - Send a GET request to the server.
@@ -2553,6 +2559,7 @@
   }
 }

+#ifndef WIN32

 /*
  * 'httpSetCredentials()' - Set the credentials associated with an encrypted
@@ -2577,6 +2584,7 @@
   return (http->tls_credentials ? 0 : -1);
 }

+#endif

 /*
  * 'httpSetCookie()' - Set the cookie value(s).
Index: htmldoc/http.h
===================================================================
--- htmldoc/http.h  (revision 1736)
+++ htmldoc/http.h  (working copy)
@@ -29,9 +29,17 @@
 #  ifdef WIN32
 #    ifndef __CUPS_SSIZE_T_DEFINED
 #      define __CUPS_SSIZE_T_DEFINED
+
+
 /* Windows does not support the ssize_t type, so map it to off_t... */
 typedef off_t ssize_t;         /* @private@ */
 #    endif /* !__CUPS_SSIZE_T_DEFINED */
+
+/* MSVC does not support __attribute__ */
+#   ifndef __attribute__
+#    define __attribute__(x)
+#    endif
+
 #    include <winsock2.h>
 #    include <ws2tcpip.h>
 #  else
Index: htmldoc/hdstring.h
===================================================================
--- htmldoc/hdstring.h  (revision 1736)
+++ htmldoc/hdstring.h  (working copy)
@@ -95,7 +95,13 @@
 #    define vsnprintf hd_vsnprintf
 #  endif /* !HAVE_VSNPRINTF */

+/*
+ * trims a string to delimeter and collapses multiple spaces between into one
+ */

+extern
+void hd_trim_to_delim(char *strtrim, char delim);
+
 #  ifdef __cplusplus
 }
 #  endif /* __cplusplus */
Index: htmldoc/http-support.c
===================================================================
--- htmldoc/http-support.c  (revision 1736)
+++ htmldoc/http-support.c  (working copy)
@@ -509,7 +509,7 @@
   _cups_md5_state_t    md5state;   /* MD5 state */
   unsigned char        md5sum[16]; /* MD5 digest/sum */

-
+#ifndef WIN32
  /*
   * Build a version 3 UUID conforming to RFC 4122.
   *
@@ -524,6 +524,7 @@
   _cupsMD5Init(&md5state);
   _cupsMD5Append(&md5state, (unsigned char *)data, (int)strlen(data));
   _cupsMD5Finish(&md5state, md5sum);
+#endif

  /*
   * Generate the UUID from the MD5...
Index: htmldoc/htmldoc.h
===================================================================
--- htmldoc/htmldoc.h   (revision 1736)
+++ htmldoc/htmldoc.h   (working copy)
@@ -261,6 +261,10 @@

 extern char    *format_number(int n, char f);

+extern double  compute_size_units(char *axis_ptr, char *unit, int divisor);
+extern double  compute_size_multiunits(char *axis_ptr, int *p_units_specified);
+extern double  compute_size_multiunits_scaled(char *axis_ptr);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
Index: htmldoc/ps-pdf.cxx
===================================================================
--- htmldoc/ps-pdf.cxx  (revision 1736)
+++ htmldoc/ps-pdf.cxx  (working copy)
@@ -4290,16 +4290,16 @@
        else
        {
          if (strchr((char *)name, '%') != NULL)
-           width = atoi((char *)name) * (*right - *left) / 100;
+       width = atoi((char *)name) * (*right - *left) / 100;
          else
-                width = atoi((char *)name) * PagePrintWidth / _htmlBrowserWidth;
+       width = compute_size_multiunits_scaled((char *)name);
             }

             if ((name = htmlGetVariable(t, (uchar *)"SIZE")) == NULL)
          height = 2;
        else
-         height = atoi((char *)name) * PagePrintWidth / _htmlBrowserWidth;
-
+         height = compute_size_multiunits_scaled((char *)name);
+       
             switch (t->halignment)
        {
          case ALIGN_LEFT :
@@ -5639,7 +5639,7 @@
     if (var[strlen((char *)var) - 1] == '%')
       table_width = atof((char *)var) * (right - left) / 100.0f;
     else
-      table_width = atoi((char *)var) * PagePrintWidth / _htmlBrowserWidth;
+      table_width = compute_size_multiunits_scaled((char *)var);
   }
   else
     table_width = right - left;
@@ -5649,7 +5649,7 @@
     if (var[strlen((char *)var) - 1] == '%')
       table_height = atof((char *)var) * (top - bottom) / 100.0f;
     else
-      table_height = atoi((char *)var) * PagePrintWidth / _htmlBrowserWidth;
+      table_height = compute_size_multiunits_scaled((char *)var);
   }
   else
     table_height = -1.0f;
@@ -5952,7 +5952,7 @@
     if (var[strlen((char *)var) - 1] == '%')
       width = atof((char *)var) * (right - left) / 100.0f;
     else
-      width = atoi((char *)var) * PagePrintWidth / _htmlBrowserWidth;
+      width = compute_size_multiunits_scaled((char *)var);
   }
   else
   {
@@ -6320,7 +6320,7 @@
    temp_height = atof((char *)height_var) * 0.01f *
                  (PagePrintLength - 2 * cellpadding);
       else
-        temp_height = atof((char *)height_var) * PagePrintWidth / _htmlBrowserWidth;
+   temp_height = compute_size_multiunits_scaled((char *)height_var); 

       if (table_height > 0.0f && temp_height > table_height)
         temp_height = table_height;
@@ -6580,7 +6580,8 @@
         if (height_var[strlen((char *)height_var) - 1] == '%')
      temp_height = atof((char *)height_var) * 0.01f * PagePrintLength;
    else
-          temp_height = atof((char *)height_var) * PagePrintWidth / _htmlBrowserWidth;
+     temp_height = compute_size_multiunits_scaled((char *)height_var); 
+     // atof((char *)height_var) * PagePrintWidth / _htmlBrowserWidth;

         if (table_height > 0 && temp_height > table_height)
           temp_height = table_height;
@@ -8829,7 +8830,7 @@
     if (var[strlen((char *)var) - 1] == '%')
       width = (right - left) * atoi((char *)var) * 0.01f;
     else
-      width = atoi((char *)var) * PagePrintWidth / _htmlBrowserWidth;
+      width = compute_size_multiunits_scaled((char *)var);
   }
   else
     width = 0.0f;
@@ -8847,7 +8848,7 @@
     if (var[strlen((char *)var) - 1] == '%')
       minh = PagePrintLength * atoi((char *)var) * 0.01f;
     else
-      minh = atoi((char *)var) * PagePrintWidth / _htmlBrowserWidth;
+      minh = compute_size_multiunits_scaled((char *)var);
   }
   else
     minh = 0.0f;
@@ -9160,7 +9161,8 @@
     if (var[strlen((char *)var) - 1] == '%')
       width = (right - left) * atoi((char *)var) * 0.01f;
     else
-      width = atoi((char *)var) * PagePrintWidth / _htmlBrowserWidth;
+      width = compute_size_multiunits_scaled((char *)var);
+
   }
   else
     width = 0.0f;
@@ -9175,7 +9177,7 @@
     if (var[strlen((char *)var) - 1] == '%')
       minh = PagePrintLength * atoi((char *)var) * 0.01f;
     else
-      minh = atoi((char *)var) * PagePrintWidth / _htmlBrowserWidth;
+   minh = compute_size_multiunits_scaled((char *)var);
   }
   else
     minh = 0.0f;
Index: htmldoc/util.cxx
===================================================================
--- htmldoc/util.cxx    (revision 1736)
+++ htmldoc/util.cxx    (working copy)
@@ -501,7 +501,129 @@
   }
 }

+/*
+* 'compute_size_units()' - Factors for "in", "mm", "px" and "cm" as unit sizes
+*/

+double
+compute_size_units(char *axis_ptr, char *unit, int divisor)
+{
+    int    slen;
+    int    ulen;
+    double units;
+
+    slen = strlen((char *)axis_ptr);
+    ulen = strlen(unit);
+
+    if (slen > ulen && strstr(axis_ptr + slen - ulen, unit))
+    {
+   units = (int)(atof(axis_ptr) * (double)_htmlPPI / ((double)divisor));
+    }
+    else
+    {
+   units = 0;
+    }
+    return units;
+}
+
+double
+compute_size_multiunits(char *axis_ptr,
+int *p_units_specified)
+{
+    char   *ci_axis_ptr;
+    char   *p, *q;
+    int    alen;
+    size_t max_elements;
+    double units;
+    char   ci_axis[256];
+
+    max_elements = 255;
+    *p_units_specified = 1;
+
+    units = 0.0f;
+    alen = strnlen(axis_ptr, max_elements);
+
+    if (alen && alen < max_elements)
+    {
+   q = ci_axis;
+   p = axis_ptr;
+   while (*p)
+   {
+       *q++ = tolower(*p++);
+   }
+   *q = '\0';
+
+   /* specify all units in lower case */
+
+   switch (0)
+   {
+       /*
+       * We're not really switching, but want to abuse
+       * the "break;" keyword
+       *
+       */
+
+   default:
+       units = compute_size_units(ci_axis, "px", 96.0f);
+       if (units > 0.0f)
+       break;
+
+       units = compute_size_units(ci_axis, "in", 1.0f);
+       if (units > 0.0f)
+       break;
+
+       units = compute_size_units(ci_axis, "mm", 25.4f);
+       if (units > 0.0f)
+       break;
+
+       units = compute_size_units(ci_axis, "cm", 2.54f);
+       if (units > 0.0f)
+       break;
+
+       units = compute_size_units(ci_axis, "pc", 6.0f);
+       if (units > 0.0f)
+       break;
+
+       units = compute_size_units(ci_axis, "pt", 72.0f);
+       if (units > 0.0f)
+       break;
+
+       units = compute_size_units(ci_axis, "q", 101.6f);
+       if (units > 0.0f)
+       break;
+
+       /*
+       * Just assume it's raw as a fall back to retain
+       * initial backward compatibility behaviour
+       * where e.g. --browserwidth, is 3307 for
+       * 400 DPI A4
+       */
+       units = (int)(atof(axis_ptr) * (double) 72.0f / (double)_htmlPPI);
+
+       /* Allow % as no units specified */
+       *p_units_specified = 0;
+       break;
+   }
+    }
+
+    return units;
+}
+
+double
+compute_size_multiunits_scaled(char *axis_ptr)
+{
+    int    units_specified;
+    double units;
+
+    units = compute_size_multiunits(axis_ptr, &units_specified);
+    if (units_specified)
+    {
+   units *= (double) 72.0f / (double)_htmlPPI;
+    }
+    return units;
+}
+
+
 /*
  * End of "$Id$".
  */
Index: htmldoc/string.c
===================================================================
--- htmldoc/string.c    (revision 1736)
+++ htmldoc/string.c    (working copy)
@@ -206,7 +206,118 @@
 }
 #endif /* !HAVE_STRLCPY */

+/*
+ * trims a string to delimeter and collapses multiple spaces between into one
+ *
+ * WARNING:
+ *
+ * self-overwrites the source string
+ *
+ * Used for processing font names with spaces e.g. "Arial Narrow,Helvetica-Narrow"
+ * 
+ * Removes leading spaces and multiple redundant delimiters
+ * e.g. " ,, Arial Narrow  , Helvetica-Narrow,"
+ * 
+ */

+void hd_trim_to_delim(char *strtrim, char delim)
+{
+   char *p;
+   char *q;
+
+   int blnDelimFound = 0;
+   int blnSpaceFound = 0;
+   int blnValid = 0;
+
+   p = q = strtrim;
+
+   /* treat first part as if we have just found a delimiter */
+
+   while (*p)
+   {
+       blnDelimFound = 1;
+       while (*p && blnDelimFound)
+       {
+           if (isspace(*p))
+           {
+               /* Consume leading whitespace */
+               p++;
+           }
+           else if (*p == delim)
+           {
+               /* consume excess delimeters */
+               p++;
+           }
+           else
+           {
+               blnDelimFound = 0;
+               blnSpaceFound = 0;
+               /* we've found a valid character */
+               *q++ = *p++;
+               blnValid = 1;
+           }
+       }
+
+       /* now copy characters across until the next delimiter */
+       blnSpaceFound = 0;
+       while (*p && !blnDelimFound)
+       {
+           if (isspace(*p))
+           {
+               if (!blnSpaceFound)
+               {
+                   *q++ = ' ';
+                   blnSpaceFound = 1;
+               }
+               p++;
+           }
+           else if (*p == delim)
+           {
+               blnDelimFound = 1;
+
+               if (blnSpaceFound)
+               {
+                   /* remove the trailing space */
+                   *--q = '\0';
+                   blnSpaceFound = 0;
+               }
+
+               *q++ = *p++;
+           }
+           else
+           {
+               blnSpaceFound = 0;
+               *q++ = *p++;
+           }
+       }
+   }
+   if (blnValid)
+   {
+       if (blnDelimFound)
+       {
+           /* remove the trailing space */
+           *--q = '\0';
+           blnDelimFound = 0;
+       }
+       else if (blnSpaceFound)
+       {
+           /* remove the trailing space */
+           *--q = '\0';
+           blnSpaceFound = 0;
+       }
+       *q = '\0';
+   }
+   else
+   {
+       q = strtrim;
+       if (q)
+       {
+           *q = '\0';
+       }
+   }
+}
+
+
 /*
  * End of "$Id$".
  */
Index: htmldoc/htmllib.cxx
===================================================================
--- htmldoc/htmllib.cxx (revision 1736)
+++ htmldoc/htmllib.cxx (working copy)
@@ -260,6 +260,7 @@
 static void    insert_space(tree_t *parent, tree_t *t);
 static int parse_markup(tree_t *t, FILE *fp, int *linenum);
 static int parse_variable(tree_t *t, FILE *fp, int *linenum);
+
 static int compute_size(tree_t *t);
 static int compute_color(tree_t *t, uchar *color);
 static int get_alignment(tree_t *t);
@@ -2949,60 +2950,98 @@
 static int         /* O - 0 = success, -1 = failure */
 compute_size(tree_t *t)        /* I - Tree entry */
 {
-  uchar        *ptr;       /* Current character */
-  float        width,      /* Current width */
+   uchar       *ptr;       /* Current character */
+   float       width,      /* Current width */
        max_width;  /* Maximum width */
-  uchar        *width_ptr, /* Pointer to width string */
+   uchar       *width_ptr, /* Pointer to width string */
        *height_ptr,    /* Pointer to height string */
        *size_ptr,  /* Pointer to size string */
        *type_ptr;  /* Pointer to spacer type string */
-  image_t  *img;       /* Image */
-  char     number[255];    /* Width or height value */
+   image_t *img;       /* Image */
+   char        number[255];    /* Width or height value */

+   int     units_specified;

-  if (!_htmlInitialized)
-    htmlSetCharSet("iso-8859-1");
+   if (!_htmlInitialized)
+       htmlSetCharSet("iso-8859-1");

-  if (t->markup == MARKUP_IMG)
-  {
-    width_ptr  = htmlGetVariable(t, (uchar *)"WIDTH");
+   if (t->markup == MARKUP_IMG)
+   {
+    width_ptr = htmlGetVariable(t, (uchar *)"WIDTH");
     height_ptr = htmlGetVariable(t, (uchar *)"HEIGHT");

     img = image_load((char *)htmlGetVariable(t, (uchar *)"REALSRC"),
-                     _htmlGrayscale);
+       _htmlGrayscale);

     if (width_ptr != NULL && height_ptr != NULL)
     {
-      t->width  = atoi((char *)width_ptr) / _htmlPPI * 72.0f;
-      t->height = atoi((char *)height_ptr) / _htmlPPI * 72.0f;
+      t->width = compute_size_multiunits((char *)width_ptr, &units_specified); // atoi((char *)width_ptr) / _htmlPPI * 72.0f;

+      if (units_specified)
+      {
+       /* Some kind of unit was specified, so reset the htmlVariables */
+       sprintf(number, "%d", (int)t->width);
+       htmlSetVariable(t, (uchar *)"WIDTH", (uchar *)number);
+      }
+      t->height = compute_size_multiunits((char *)height_ptr, &units_specified);   // atoi((char *)height_ptr) / _htmlPPI * 72.0f;
+      if (units_specified)
+      {
+       sprintf(number, "%d", (int)t->height);
+       htmlSetVariable(t, (uchar *)"HEIGHT", (uchar *)number);
+
+      }
       return (0);
     }

     if (img == NULL)
-      return (-1);
+       return (-1);

     if (width_ptr != NULL)
     {
-      t->width  = atoi((char *)width_ptr) / _htmlPPI * 72.0f;
+      t->width = compute_size_multiunits((char *)width_ptr, &units_specified); // atoi((char *)width_ptr) / _htmlPPI * 72.0f;
       t->height = t->width * img->height / img->width;

-      sprintf(number, "%d",
-              atoi((char *)width_ptr) * img->height / img->width);
-      if (strchr((char *)width_ptr, '%') != NULL)
-        strlcat(number, "%", sizeof(number));
-      htmlSetVariable(t, (uchar *)"HEIGHT", (uchar *)number);
+      if (!units_specified)
+      {
+       sprintf(number, "%d",
+           atoi((char *)width_ptr) * img->height / img->width);
+       if (strchr((char *)width_ptr, '%') != NULL)
+           strlcat(number, "%", sizeof(number));
+      }
+      else
+      {
+       sprintf(number, "%d",
+           (int)t->width * img->height / img->width);
+       htmlSetVariable(t, (uchar *)"HEIGHT", (uchar *)number);
+
+       sprintf(number, "%d", (int)t->width);
+       htmlSetVariable(t, (uchar *)"WIDTH", (uchar *)number);
+      }
     }
     else if (height_ptr != NULL)
     {
-      t->height = atoi((char *)height_ptr) / _htmlPPI * 72.0f;
-      t->width  = t->height * img->width / img->height;
+      t->height = compute_size_multiunits((char *)height_ptr, &units_specified);   // atoi((char *)height_ptr) / _htmlPPI * 72.0f;
+      t->width = t->height * img->width / img->height;

-      sprintf(number, "%d",
-              atoi((char *)height_ptr) * img->width / img->height);
-      if (strchr((char *)height_ptr, '%') != NULL)
-        strlcat(number, "%", sizeof(number));
-      htmlSetVariable(t, (uchar *)"WIDTH", (uchar *)number);
+      if (!units_specified)
+      {
+       sprintf(number, "%d",
+           atoi((char *)height_ptr) * img->width / img->height);
+       if (strchr((char *)height_ptr, '%') != NULL)
+           strlcat(number, "%", sizeof(number));
+
+
+      }
+      else
+      {
+       sprintf(number, "%d",
+           (int)t->height * img->width / img->height);
+
+       htmlSetVariable(t, (uchar *)"WIDTH", (uchar *)number);
+
+       sprintf(number, "%d", (int)t->height);
+       htmlSetVariable(t, (uchar *)"HEIGHT", (uchar *)number);
+      }
     }
     else
     {
Index: vcnet/htmldoc.sln
===================================================================
--- vcnet/htmldoc.sln   (revision 1736)
+++ vcnet/htmldoc.sln   (working copy)
@@ -1,25 +1,16 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ghtmldoc", "ghtmldoc.vcproj", "{A45127A6-7A50-48AE-820A-E0D821516AD4}"
-   ProjectSection(ProjectDependencies) = postProject
-       {1132A142-F8A1-4464-881C-7F50D77A1CD2} = {1132A142-F8A1-4464-881C-7F50D77A1CD2}
-       {07169A72-08A9-4EC8-BC6C-CCBC1F01EA58} = {07169A72-08A9-4EC8-BC6C-CCBC1F01EA58}
-       {287D2FB4-9941-4B64-B973-55A6EC04EAFC} = {287D2FB4-9941-4B64-B973-55A6EC04EAFC}
-       {F4B8B6F3-8198-4FC3-92A3-C944644B570A} = {F4B8B6F3-8198-4FC3-92A3-C944644B570A}
-   EndProjectSection
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.40629.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ghtmldoc", "ghtmldoc.vcxproj", "{A45127A6-7A50-48AE-820A-E0D821516AD4}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "htmldoc", "htmldoc.vcproj", "{287D2FB4-9941-4B64-B973-55A6EC04EAFC}"
-   ProjectSection(ProjectDependencies) = postProject
-       {1132A142-F8A1-4464-881C-7F50D77A1CD2} = {1132A142-F8A1-4464-881C-7F50D77A1CD2}
-       {07169A72-08A9-4EC8-BC6C-CCBC1F01EA58} = {07169A72-08A9-4EC8-BC6C-CCBC1F01EA58}
-       {F4B8B6F3-8198-4FC3-92A3-C944644B570A} = {F4B8B6F3-8198-4FC3-92A3-C944644B570A}
-   EndProjectSection
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "htmldoc", "htmldoc.vcxproj", "{287D2FB4-9941-4B64-B973-55A6EC04EAFC}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpeg", "jpeg.vcproj", "{07169A72-08A9-4EC8-BC6C-CCBC1F01EA58}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpeg", "jpeg.vcxproj", "{07169A72-08A9-4EC8-BC6C-CCBC1F01EA58}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libpng.vcproj", "{1132A142-F8A1-4464-881C-7F50D77A1CD2}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libpng.vcxproj", "{1132A142-F8A1-4464-881C-7F50D77A1CD2}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib.vcproj", "{F4B8B6F3-8198-4FC3-92A3-C944644B570A}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib.vcxproj", "{F4B8B6F3-8198-4FC3-92A3-C944644B570A}"
 EndProject
 Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "htmldoc-installer", "htmldoc-installer.vdproj", "{CE7334CB-F82B-4F29-8648-D959871BBC71}"
    ProjectSection(ProjectDependencies) = postProject
@@ -30,33 +21,57 @@
 Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Win32 = Debug|Win32
+       Debug|x64 = Debug|x64
        Release|Win32 = Release|Win32
+       Release|x64 = Release|x64
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {A45127A6-7A50-48AE-820A-E0D821516AD4}.Debug|Win32.ActiveCfg = Debug|Win32
        {A45127A6-7A50-48AE-820A-E0D821516AD4}.Debug|Win32.Build.0 = Debug|Win32
+       {A45127A6-7A50-48AE-820A-E0D821516AD4}.Debug|x64.ActiveCfg = Debug|x64
+       {A45127A6-7A50-48AE-820A-E0D821516AD4}.Debug|x64.Build.0 = Debug|x64
        {A45127A6-7A50-48AE-820A-E0D821516AD4}.Release|Win32.ActiveCfg = Release|Win32
        {A45127A6-7A50-48AE-820A-E0D821516AD4}.Release|Win32.Build.0 = Release|Win32
+       {A45127A6-7A50-48AE-820A-E0D821516AD4}.Release|x64.ActiveCfg = Release|x64
+       {A45127A6-7A50-48AE-820A-E0D821516AD4}.Release|x64.Build.0 = Release|x64
        {287D2FB4-9941-4B64-B973-55A6EC04EAFC}.Debug|Win32.ActiveCfg = Debug|Win32
        {287D2FB4-9941-4B64-B973-55A6EC04EAFC}.Debug|Win32.Build.0 = Debug|Win32
+       {287D2FB4-9941-4B64-B973-55A6EC04EAFC}.Debug|x64.ActiveCfg = Debug|x64
+       {287D2FB4-9941-4B64-B973-55A6EC04EAFC}.Debug|x64.Build.0 = Debug|x64
        {287D2FB4-9941-4B64-B973-55A6EC04EAFC}.Release|Win32.ActiveCfg = Release|Win32
        {287D2FB4-9941-4B64-B973-55A6EC04EAFC}.Release|Win32.Build.0 = Release|Win32
+       {287D2FB4-9941-4B64-B973-55A6EC04EAFC}.Release|x64.ActiveCfg = Release|x64
+       {287D2FB4-9941-4B64-B973-55A6EC04EAFC}.Release|x64.Build.0 = Release|x64
        {07169A72-08A9-4EC8-BC6C-CCBC1F01EA58}.Debug|Win32.ActiveCfg = Debug|Win32
        {07169A72-08A9-4EC8-BC6C-CCBC1F01EA58}.Debug|Win32.Build.0 = Debug|Win32
+       {07169A72-08A9-4EC8-BC6C-CCBC1F01EA58}.Debug|x64.ActiveCfg = Debug|x64
+       {07169A72-08A9-4EC8-BC6C-CCBC1F01EA58}.Debug|x64.Build.0 = Debug|x64
        {07169A72-08A9-4EC8-BC6C-CCBC1F01EA58}.Release|Win32.ActiveCfg = Release|Win32
        {07169A72-08A9-4EC8-BC6C-CCBC1F01EA58}.Release|Win32.Build.0 = Release|Win32
+       {07169A72-08A9-4EC8-BC6C-CCBC1F01EA58}.Release|x64.ActiveCfg = Release|x64
+       {07169A72-08A9-4EC8-BC6C-CCBC1F01EA58}.Release|x64.Build.0 = Release|x64
        {1132A142-F8A1-4464-881C-7F50D77A1CD2}.Debug|Win32.ActiveCfg = Debug|Win32
        {1132A142-F8A1-4464-881C-7F50D77A1CD2}.Debug|Win32.Build.0 = Debug|Win32
+       {1132A142-F8A1-4464-881C-7F50D77A1CD2}.Debug|x64.ActiveCfg = Debug|x64
+       {1132A142-F8A1-4464-881C-7F50D77A1CD2}.Debug|x64.Build.0 = Debug|x64
        {1132A142-F8A1-4464-881C-7F50D77A1CD2}.Release|Win32.ActiveCfg = Release|Win32
        {1132A142-F8A1-4464-881C-7F50D77A1CD2}.Release|Win32.Build.0 = Release|Win32
+       {1132A142-F8A1-4464-881C-7F50D77A1CD2}.Release|x64.ActiveCfg = Release|x64
+       {1132A142-F8A1-4464-881C-7F50D77A1CD2}.Release|x64.Build.0 = Release|x64
        {F4B8B6F3-8198-4FC3-92A3-C944644B570A}.Debug|Win32.ActiveCfg = Debug|Win32
        {F4B8B6F3-8198-4FC3-92A3-C944644B570A}.Debug|Win32.Build.0 = Debug|Win32
+       {F4B8B6F3-8198-4FC3-92A3-C944644B570A}.Debug|x64.ActiveCfg = Debug|x64
+       {F4B8B6F3-8198-4FC3-92A3-C944644B570A}.Debug|x64.Build.0 = Debug|x64
        {F4B8B6F3-8198-4FC3-92A3-C944644B570A}.Release|Win32.ActiveCfg = Release|Win32
        {F4B8B6F3-8198-4FC3-92A3-C944644B570A}.Release|Win32.Build.0 = Release|Win32
+       {F4B8B6F3-8198-4FC3-92A3-C944644B570A}.Release|x64.ActiveCfg = Release|x64
+       {F4B8B6F3-8198-4FC3-92A3-C944644B570A}.Release|x64.Build.0 = Release|x64
        {CE7334CB-F82B-4F29-8648-D959871BBC71}.Debug|Win32.ActiveCfg = Debug
        {CE7334CB-F82B-4F29-8648-D959871BBC71}.Debug|Win32.Build.0 = Debug
+       {CE7334CB-F82B-4F29-8648-D959871BBC71}.Debug|x64.ActiveCfg = Debug
        {CE7334CB-F82B-4F29-8648-D959871BBC71}.Release|Win32.ActiveCfg = Release
        {CE7334CB-F82B-4F29-8648-D959871BBC71}.Release|Win32.Build.0 = Release
+       {CE7334CB-F82B-4F29-8648-D959871BBC71}.Release|x64.ActiveCfg = Release
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
Index: vcnet/config.h
===================================================================
--- vcnet/config.h  (revision 1736)
+++ vcnet/config.h  (working copy)
@@ -70,7 +70,9 @@
 #undef HAVE_GNUTLS
 #undef HAVE_LIBSSL
 #define HAVE_SSPISSL
-#define HAVE_SSL
+/*
+ #define HAVE_SSL
+*/

 /*
@@ -136,8 +138,10 @@
  * Do we have the long long type?
  */

-#undef HAVE_LONG_LONG
+/* #undef HAVE_LONG_LONG VS2013 has this */

+#define HAVE_LONG_LONG 
+
 #ifdef HAVE_LONG_LONG
 #  define HTMLDOC_LLFMT        "%lld"
 #  define HTMLDOC_LLCAST   (long long)
@@ -151,7 +155,8 @@
  * Do we have the strtoll() function?
  */

-#undef HAVE_STRTOLL
+/* #undef HAVE_STRTOLL VS2013 has this */
+#define HAVE_STRTOLL

 #ifndef HAVE_STRTOLL
 #  define strtoll(nptr,endptr,base) strtol((nptr), (endptr), (base))
michaelrsweet commented 7 years ago

Might consider supporting the style attribute and width/height properties instead, otherwise the HTML input won't be valid...

birdwes commented 7 years ago

Hi Michael,

The reason I implemented in my local copy this was for compatibility with Internet Explorer print templates as described here: . I use an embedded IE as an engine to print the page if there is no email address. If there is an email address, it is converted to PDF and sent. Internet Explorer accepts "in","mm","px" etc, even though it is not really standards compliant.

Thanks for your good work.

Iain W. Bird

birdwes commented 7 years ago

https://msdn.microsoft.com/en-us/library/bb250460

michaelrsweet commented 7 years ago

Yeah, well I do want to keep things standards-compliant as much as possible, particularly as I implement support for EPUB which requires strict XHTML conformance...

Like I said, I'm considering adding support for things like:

<img style="width: 4in; height: 3in;" src="..." ...>

to override the normal browser width/PPI calculations and remain standards-compliant.