diff --git a/utils/pdftohtml.cc b/utils/pdftohtml.cc
index 6735f5d..9714832 100644
--- a/utils/pdftohtml.cc
+++ b/utils/pdftohtml.cc
@@ -94,6 +94,7 @@ static GBool printVersion = gFalse;
 
 static GooString* getInfoString(Dict *infoDict, const char *key);
 static GooString* getInfoDate(Dict *infoDict, const char *key);
+static GooString* shellEscape(const char *p);
 
 static char textEncName[128] = "";
 
@@ -473,7 +474,9 @@ int main(int argc, char *argv[]) {
       GooString *gsCmd = new GooString(GHOSTSCRIPT);
       GooString *tw, *th, *sc;
       gsCmd->append(" -sDEVICE=");
-      gsCmd->append(gsDevice);
+      GooString *gsDeviceEsc = shellEscape( gsDevice );
+      gsCmd->append(gsDeviceEsc);
+      delete gsDeviceEsc;
       gsCmd->append(" -dBATCH -dNOPROMPT -dNOPAUSE -r");
       sc = GooString::fromInt(static_cast<int>(72*scale));
       gsCmd->append(sc);
@@ -523,6 +526,36 @@ int main(int argc, char *argv[]) {
   return 0;
 }
 
+static GooString* shellEscape(const char *p)
+{
+  GooString *out = new GooString();
+
+  if (p == NULL || *p == 0) {
+	  out->append("''", 2);
+	  return out;
+  }
+
+  // start single quote quotation
+  out->append("'", 1);
+  while (*p) {
+    switch(*p) {
+    case '\'':
+      // one single quote to stop quotation
+      // one escaped single quote
+      // one single quote to start quotation
+      out->append( "'\\''", 4 );
+      break;
+    default:
+      out->append( p, 1 );
+      break;
+    }
+    p++;
+  }
+  // stop single quote quotation
+  out->append("'", 1);
+  return out;
+}
+
 static GooString* getInfoString(Dict *infoDict, const char *key) {
   Object obj;
   // Raw value as read from PDF (may be in pdfDocEncoding or UCS2)
