diff -ruN lilypond-2.5.27-orig/lily/pfb.cc lilypond-2.5.27/lily/pfb.cc
--- lilypond-2.5.27-orig/lily/pfb.cc	2005-06-01 23:56:50.000000000 -0700
+++ lilypond-2.5.27/lily/pfb.cc	2005-06-05 04:28:01.000000000 -0700
@@ -108,8 +108,7 @@
   String file_name = ly_scm2string (ttf_file_name);
   if (be_verbose_global)
     progress_indication ("[" + file_name);
-  
   Memory_out_stream stream;
   create_type42 (file_name.to_str0 (), stream.get_file ());
   SCM asscm = scm_from_locale_stringn (stream.get_string (),
@@ -121,8 +120,6 @@
   return asscm;
 }
 
-
-
 LY_DEFINE (ly_otf_to_cff, "ly:otf->cff",
 	   1, 0, 0, (SCM otf_file_name),
 	   "Convert the contents of a OTF file to CFF file, returning it as "
@@ -146,3 +143,61 @@
   
   return asscm;
 }	   
+
+static int run_fontforge(const char * filename)
+{
+  //
+  // Run subprocess. We use fork() / exec() so we can do the chdir() and
+  // to avoid security risks with the font path.
+  //
+  pid_t ffPID = fork ();
+  if (ffPID < 0) {
+	return -1;
+  } else if (!ffPID) {
+	//
+	// Child process, run fontforge
+	//
+	execlp ("fontforge", "fontforge", "-c", 
+			"Open($argv[1], 1); Generate($argv[2])",
+			filename, "converted_font.pfa", NULL);
+	// Should not happen
+	exit(1);
+  } else {
+	int status;
+	if (waitpid (ffPID, &status, 0) < 0 || status) 
+	  return -1;
+  }	
+  return 0;
+}
+
+LY_DEFINE (ly_other_to_pfa, "ly:other->pfa",
+	   1, 0, 0, (SCM font_file_name),
+	   "Convert the contents of an unknown font file to Type42 PFA by"
+	   " calling fontforge, returning it as a string.")
+{
+  //
+  // Many weird font file formats can be handled by fontforge
+  // we could cache the conversion result, but right now, we don't
+  //
+  String file_name = ly_scm2string (font_file_name);
+
+  if (be_verbose_global)
+	progress_indication ("[" + file_name + "]");
+
+  fprintf(stderr, "\nTrying fontforge to convert `%s'...\n",
+		  file_name.to_str0 ());
+
+  if (!run_fontforge (file_name.to_str0 ())) {
+	  int len;
+	  char *str = gulp_file ("converted_font.pfa", &len);
+
+	  SCM asscm = scm_from_locale_stringn (str, len);
+
+	  remove ("converted_font.pfa");
+	  remove ("converted_font.afm");
+
+	  return asscm;
+  }
+
+  return scm_makfrom0str ("");
+}	   
diff -ruN lilypond-2.5.27-orig/scm/framework-ps.scm lilypond-2.5.27/scm/framework-ps.scm
--- lilypond-2.5.27-orig/scm/framework-ps.scm	2005-06-01 23:56:55.000000000 -0700
+++ lilypond-2.5.27/scm/framework-ps.scm	2005-06-05 02:51:15.000000000 -0700
@@ -286,8 +286,10 @@
 		       name
 		       0))
 	(else
-	 (ly:warning (_ "don't know how to embed ~S=~S") name file-name)
-	  "")))))
+	 (let* ((fallback (ly:other->pfa bare-file-name)))
+	   (if (= (string-length fallback) 0)
+	       (ly:warning (_ "don't know how to embed ~S=~S") name file-name))
+	   fallback))))))
 
   (define (load-fonts paper)
     (let* ((fonts (ly:paper-fonts paper))
