Example #1
0
 public static extern void wkhtmltoimage_set_finished_callback(IntPtr converter, [MarshalAs(UnmanagedType.FunctionPtr)] wkhtmltoimage_bool_callback cb);
		private byte[] _Convert(string inputHtml) {
			var converter = IntPtr.Zero;
			var inputHtmlUtf8Ptr = IntPtr.Zero;
			var errorCb = new wkhtmltoimage_str_callback(OnError);
			var warnCb = new wkhtmltoimage_str_callback(OnWarning);
			var phaseCb = new wkhtmltoimage_void_callback(OnPhaseChanged);
			var progressCb = new wkhtmltoimage_int_callback(OnProgressChanged);
			var finishCb = new wkhtmltoimage_bool_callback(OnFinished);

			try {
				var gSettings = _BuildGlobalSettings();
				//var oSettings = _BuildObjectsettings();

				inputHtmlUtf8Ptr = Marshaller.StringToUtf8Ptr(inputHtml);
				converter = _BuildConverter(gSettings, inputHtmlUtf8Ptr);

				_errorString = new StringBuilder();

				wkhtmltoimage_set_error_callback(converter, errorCb);
				wkhtmltoimage_set_warning_callback(converter, warnCb);
				wkhtmltoimage_set_phase_changed_callback(converter, phaseCb);
				wkhtmltoimage_set_progress_changed_callback(converter, progressCb);
				wkhtmltoimage_set_finished_callback(converter, finishCb);

				OnBegin(wkhtmltoimage_phase_count(converter));

				if (!wkhtmltoimage_convert(converter)) {
					var msg = string.Format("HtmlToPdf conversion failed: {0}", _errorString.ToString());
					throw new ApplicationException(msg);
				}

				if (!string.IsNullOrEmpty(GlobalSettings.Out))
					return null;

				_Log.LogDebug("CONVERSION DONE.. getting output.");

				// Get output from internal buffer..

				IntPtr tmp = IntPtr.Zero;
				var len = wkhtmltoimage_get_output(converter, out tmp);
				var output = new byte[len];
				Marshal.Copy(tmp, output, 0, output.Length);

				return output;
			} finally {
				if (converter != IntPtr.Zero) {
					wkhtmltoimage_set_error_callback(converter, null);
					wkhtmltoimage_set_warning_callback(converter, null);
					wkhtmltoimage_set_phase_changed_callback(converter, null);
					wkhtmltoimage_set_progress_changed_callback(converter, null);
					wkhtmltoimage_set_finished_callback(converter, null);
					wkhtmltoimage_destroy_converter(converter);
				}

				if (inputHtmlUtf8Ptr != IntPtr.Zero) {
					Marshaller.FreeUtf8Ptr(inputHtmlUtf8Ptr);
				}
			}
		}