예제 #1
0
        private async void cmdSaveAsPdf_Click(object sender, EventArgs e)
        {
            using (new CursorWait(this))
            {
                // Check to see if we have any "Print to PDF" printers, as they will be a lot more reliable than wkhtmltopdf
                string strPdfPrinter = string.Empty;
                foreach (string strPrinter in PrinterSettings.InstalledPrinters)
                {
                    if (strPrinter == "Microsoft Print to PDF" || strPrinter == "Foxit Reader PDF Printer" ||
                        strPrinter == "Adobe PDF")
                    {
                        strPdfPrinter = strPrinter;
                        break;
                    }
                }

                if (!string.IsNullOrEmpty(strPdfPrinter))
                {
                    DialogResult ePdfPrinterDialogResult = Program.MainForm.ShowMessageBox(this,
                                                                                           string.Format(GlobalSettings.CultureInfo,
                                                                                                         await LanguageManager.GetStringAsync("Message_Viewer_FoundPDFPrinter"), strPdfPrinter),
                                                                                           await LanguageManager.GetStringAsync("MessageTitle_Viewer_FoundPDFPrinter"),
                                                                                           MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information);
                    switch (ePdfPrinterDialogResult)
                    {
                    case DialogResult.Cancel:
                    case DialogResult.Yes when DoPdfPrinterShortcut(strPdfPrinter):
                        return;

                    case DialogResult.Yes:
                        Program.MainForm.ShowMessageBox(this,
                                                        await LanguageManager.GetStringAsync("Message_Viewer_PDFPrinterError"));
                        break;
                    }
                }

                // Save the generated output as PDF.
                SaveFileDialog1.Filter = await LanguageManager.GetStringAsync("DialogFilter_Pdf") + '|' +
                                         await LanguageManager.GetStringAsync("DialogFilter_All");

                SaveFileDialog1.Title = await LanguageManager.GetStringAsync("Button_Viewer_SaveAsPdf");

                SaveFileDialog1.ShowDialog();
                string strSaveFile = SaveFileDialog1.FileName;

                if (string.IsNullOrEmpty(strSaveFile))
                {
                    return;
                }

                if (!strSaveFile.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
                {
                    strSaveFile += ".pdf";
                }

                if (!Directory.Exists(Path.GetDirectoryName(strSaveFile)) || !Utils.CanWriteToPath(strSaveFile))
                {
                    Program.MainForm.ShowMessageBox(this,
                                                    string.Format(GlobalSettings.CultureInfo,
                                                                  await LanguageManager.GetStringAsync(
                                                                      "Message_File_Cannot_Be_Accessed"), strSaveFile));
                    return;
                }

                if (!await Utils.SafeDeleteFileAsync(strSaveFile, true))
                {
                    Program.MainForm.ShowMessageBox(this,
                                                    string.Format(GlobalSettings.CultureInfo,
                                                                  await LanguageManager.GetStringAsync(
                                                                      "Message_File_Cannot_Be_Accessed"), strSaveFile));
                    return;
                }

                // No PDF printer found, let's use wkhtmltopdf

                try
                {
                    PdfDocument objPdfDocument = new PdfDocument
                    {
                        Html        = webViewer.DocumentText,
                        ExtraParams = new Dictionary <string, string>(8)
                        {
                            { "encoding", "UTF-8" },
                            { "dpi", "300" },
                            { "margin-top", "13" },
                            { "margin-bottom", "19" },
                            { "margin-left", "13" },
                            { "margin-right", "13" },
                            { "image-quality", "100" },
                            { "print-media-type", string.Empty }
                        }
                    };
                    PdfConvertEnvironment objPdfConvertEnvironment = new PdfConvertEnvironment
                    {
                        WkHtmlToPdfPath = Path.Combine(Utils.GetStartupPath, "wkhtmltopdf.exe")
                    };
                    PdfOutput objPdfOutput = new PdfOutput {
                        OutputFilePath = strSaveFile
                    };
                    await PdfConvert.ConvertHtmlToPdfAsync(objPdfDocument, objPdfConvertEnvironment, objPdfOutput);

                    if (!string.IsNullOrWhiteSpace(GlobalSettings.PdfAppPath))
                    {
                        Uri    uriPath   = new Uri(strSaveFile);
                        string strParams = GlobalSettings.PdfParameters
                                           .Replace("{page}", "1")
                                           .Replace("{localpath}", uriPath.LocalPath)
                                           .Replace("{absolutepath}", uriPath.AbsolutePath);
                        ProcessStartInfo objPdfProgramProcess = new ProcessStartInfo
                        {
                            FileName    = GlobalSettings.PdfAppPath,
                            Arguments   = strParams,
                            WindowStyle = ProcessWindowStyle.Hidden
                        };
                        objPdfProgramProcess.Start();
                    }
                }
                catch (Exception ex)
                {
                    Program.MainForm.ShowMessageBox(this, ex.ToString());
                }
            }
        }
예제 #2
0
            public static void ConvertHtmlToPdf(PdfDocument document, PdfConvertEnvironment environment, PdfOutput woutput)
            {
                if (environment == null)
                {
                    environment = Environment;
                }

                if (document.Html != null)
                {
                    document.Url = "-";
                }

                String outputPdfFilePath;
                bool   delete;

                if (woutput.OutputFilePath != null)
                {
                    outputPdfFilePath = woutput.OutputFilePath;
                    delete            = false;
                }
                else
                {
                    outputPdfFilePath = Path.Combine(environment.TempFolderPath, String.Format("{0}.pdf", Guid.NewGuid()));
                    delete            = true;
                }

                if (!File.Exists(environment.WkHtmlToPdfPath))
                {
                    throw new PdfConvertException(String.Format("File '{0}' not found. Check if wkhtmltopdf application is installed.", environment.WkHtmlToPdfPath));
                }

                StringBuilder paramsBuilder = new StringBuilder();

                paramsBuilder.Append("--page-size A4 ");

                if (!string.IsNullOrEmpty(document.HeaderUrl))
                {
                    paramsBuilder.AppendFormat("--header-html {0} ", document.HeaderUrl);
                    paramsBuilder.Append("--margin-top 25 ");
                    paramsBuilder.Append("--header-spacing 5 ");
                }
                if (!string.IsNullOrEmpty(document.FooterUrl))
                {
                    paramsBuilder.AppendFormat("--footer-html {0} ", document.FooterUrl);
                    paramsBuilder.Append("--margin-bottom 25 ");
                    paramsBuilder.Append("--footer-spacing 5 ");
                }
                if (!string.IsNullOrEmpty(document.HeaderLeft))
                {
                    paramsBuilder.AppendFormat("--header-left \"{0}\" ", document.HeaderLeft);
                }

                if (!string.IsNullOrEmpty(document.HeaderCenter))
                {
                    paramsBuilder.AppendFormat("--header-center \"{0}\" ", document.HeaderCenter);
                }

                if (!string.IsNullOrEmpty(document.HeaderRight))
                {
                    paramsBuilder.AppendFormat("--header-right \"{0}\" ", document.HeaderRight);
                }

                if (!string.IsNullOrEmpty(document.FooterLeft))
                {
                    paramsBuilder.AppendFormat("--footer-left \"{0}\" ", document.FooterLeft);
                }

                if (!string.IsNullOrEmpty(document.FooterCenter))
                {
                    paramsBuilder.AppendFormat("--footer-center \"{0}\" ", document.FooterCenter);
                }

                if (!string.IsNullOrEmpty(document.FooterRight))
                {
                    paramsBuilder.AppendFormat("--footer-right \"{0}\" ", document.FooterRight);
                }

                if (!string.IsNullOrEmpty(document.HeaderFontSize))
                {
                    paramsBuilder.AppendFormat("--header-font-size \"{0}\" ", document.HeaderFontSize);
                }

                if (!string.IsNullOrEmpty(document.FooterFontSize))
                {
                    paramsBuilder.AppendFormat("--footer-font-size \"{0}\" ", document.FooterFontSize);
                }

                if (!string.IsNullOrEmpty(document.HeaderFontName))
                {
                    paramsBuilder.AppendFormat("--header-font-name \"{0}\" ", document.HeaderFontName);
                }

                if (!string.IsNullOrEmpty(document.FooterFontName))
                {
                    paramsBuilder.AppendFormat("--footer-font-name \"{0}\" ", document.FooterFontName);
                }


                if (document.ExtraParams != null)
                {
                    foreach (var extraParam in document.ExtraParams)
                    {
                        paramsBuilder.AppendFormat("--{0} {1} ", extraParam.Key, extraParam.Value);
                    }
                }

                if (document.Cookies != null)
                {
                    foreach (var cookie in document.Cookies)
                    {
                        paramsBuilder.AppendFormat("--cookie {0} {1} ", cookie.Key, cookie.Value);
                    }
                }

                paramsBuilder.AppendFormat("\"{0}\" \"{1}\"", document.Url, outputPdfFilePath);

                try
                {
                    StringBuilder output = new StringBuilder();
                    StringBuilder error  = new StringBuilder();

                    using (Process process = new Process())
                    {
                        process.StartInfo.FileName               = environment.WkHtmlToPdfPath;
                        process.StartInfo.Arguments              = paramsBuilder.ToString();
                        process.StartInfo.UseShellExecute        = false;
                        process.StartInfo.RedirectStandardOutput = true;
                        process.StartInfo.RedirectStandardError  = true;
                        process.StartInfo.RedirectStandardInput  = true;

                        using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false))
                            using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false))
                            {
                                DataReceivedEventHandler outputHandler = (sender, e) =>
                                {
                                    if (e.Data == null)
                                    {
                                        outputWaitHandle.Set();
                                    }
                                    else
                                    {
                                        output.AppendLine(e.Data);
                                    }
                                };

                                DataReceivedEventHandler errorHandler = (sender, e) =>
                                {
                                    if (e.Data == null)
                                    {
                                        errorWaitHandle.Set();
                                    }
                                    else
                                    {
                                        error.AppendLine(e.Data);
                                    }
                                };

                                process.OutputDataReceived += outputHandler;
                                process.ErrorDataReceived  += errorHandler;

                                try
                                {
                                    process.Start();

                                    process.BeginOutputReadLine();
                                    process.BeginErrorReadLine();

                                    if (document.Html != null)
                                    {
                                        using (var stream = process.StandardInput)
                                        {
                                            byte[] buffer = Encoding.UTF8.GetBytes(document.Html);
                                            stream.BaseStream.Write(buffer, 0, buffer.Length);
                                            stream.WriteLine();
                                        }
                                    }

                                    if (process.WaitForExit(environment.Timeout) && outputWaitHandle.WaitOne(environment.Timeout) && errorWaitHandle.WaitOne(environment.Timeout))
                                    {
                                        if (process.ExitCode != 0 && !File.Exists(outputPdfFilePath))
                                        {
                                            throw new PdfConvertException(String.Format("Html to PDF conversion of '{0}' failed. Wkhtmltopdf output: \r\n{1}", document.Url, error));
                                        }
                                    }
                                    else
                                    {
                                        if (!process.HasExited)
                                        {
                                            process.Kill();
                                        }

                                        throw new PdfConvertTimeoutException();
                                    }
                                }
                                finally
                                {
                                    process.OutputDataReceived -= outputHandler;
                                    process.ErrorDataReceived  -= errorHandler;
                                }
                            }
                    }


                    if (woutput.OutputStream != null)
                    {
                        using (Stream fs = new FileStream(outputPdfFilePath, FileMode.Open))
                        {
                            byte[] buffer = new byte[32 * 1024];
                            int    read;

                            while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                woutput.OutputStream.Write(buffer, 0, read);
                            }
                        }
                    }

                    if (woutput.OutputCallback != null)
                    {
                        byte[] pdfFileBytes = File.ReadAllBytes(outputPdfFilePath);
                        woutput.OutputCallback(document, pdfFileBytes);
                    }
                }
                finally
                {
                    if (delete && File.Exists(outputPdfFilePath))
                    {
                        File.Delete(outputPdfFilePath);
                    }
                }
            }
예제 #3
0
        public static void ConvertHtmlToPdfCustom(PdfDocument document, PdfConvertEnvironment environment, PdfOutput woutput)
        {
            if (environment == null)
            {
                environment = Environment;
            }

            if (document.Html != null)
            {
                document.Url = "-";
            }

            String outputPdfFilePath;
            bool   delete;

            if (woutput.OutputFilePath != null)
            {
                outputPdfFilePath = woutput.OutputFilePath;
                delete            = false;
            }
            else
            {
                outputPdfFilePath = Path.Combine(environment.TempFolderPath, String.Format("{0}.pdf", Guid.NewGuid()));
                delete            = true;
            }

            if (!File.Exists(environment.WkHtmlToPdfPath))
            {
                throw new PdfConvertException(String.Format("File '{0}' not found. Check if wkhtmltopdf application is installed.", environment.WkHtmlToPdfPath));
            }

            StringBuilder paramsBuilder = new StringBuilder();

            //if (String.IsNullOrEmpty(document.PaperType))
            //    document.PaperType = PaperTypes.A4;
            //paramsBuilder.AppendFormat("--page-size {0} ", document.PaperType);

            if (!string.IsNullOrEmpty(document.HeaderUrl))
            {
                paramsBuilder.AppendFormat("--header-html {0} ", document.HeaderUrl);
            }
            if (!string.IsNullOrEmpty(document.FooterUrl))
            {
                paramsBuilder.AppendFormat("--footer-html {0} ", document.FooterUrl);
            }
            if (!string.IsNullOrEmpty(document.JWTToken))
            {
                string cookieData = ".AspNetCore.Antiforgery.5uYu5VgZzcE=" + document.AntiForgeryToken
                                    + ";JWTToken=" + document.JWTToken
                                    + ";.AspNetCore.Cookies=" + document.CookiesToken;
                paramsBuilder.AppendFormat("--custom-header Cookie \"{0}\" ", cookieData);
            }

            paramsBuilder.AppendFormat("--debug-javascript ");
            paramsBuilder.AppendFormat("--no-custom-header-propagation ");

            /*-B, --margin-bottom <unitreal>      Set the page bottom margin
             * -L, --margin-left <unitreal>        Set the page left margin (default 10mm)
             * -R, --margin-right <unitreal>       Set the page right margin (default 10mm)
             * -T, --margin-top <unitreal> */

            if (document.ExtraParams != null)
            {
                foreach (var extraParam in document.ExtraParams)
                {
                    paramsBuilder.AppendFormat("--{0} {1} ", extraParam.Key, extraParam.Value);
                }
            }

            if (document.Cookies != null)
            {
                foreach (var cookie in document.Cookies)
                {
                    paramsBuilder.AppendFormat("--cookie {0} {1} ", cookie.Key, cookie.Value);
                }
            }

            paramsBuilder.AppendFormat("\"{0}\" \"{1}\"", document.Url, outputPdfFilePath);

            try
            {
                StringBuilder output = new StringBuilder();
                StringBuilder error  = new StringBuilder();

                using (Process process = new Process())
                {
                    process.StartInfo.FileName               = environment.WkHtmlToPdfPath;
                    process.StartInfo.Arguments              = paramsBuilder.ToString();
                    process.StartInfo.UseShellExecute        = false;
                    process.StartInfo.RedirectStandardOutput = true;
                    process.StartInfo.RedirectStandardError  = true;
                    process.StartInfo.RedirectStandardInput  = true;

                    using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false))
                        using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false))
                        {
                            DataReceivedEventHandler outputHandler = (sender, e) =>
                            {
                                if (e.Data == null)
                                {
                                    outputWaitHandle.Set();
                                }
                                else
                                {
                                    output.AppendLine(e.Data);
                                }
                            };

                            DataReceivedEventHandler errorHandler = (sender, e) =>
                            {
                                if (e.Data == null)
                                {
                                    errorWaitHandle.Set();
                                }
                                else
                                {
                                    error.AppendLine(e.Data);
                                }
                            };

                            process.OutputDataReceived += outputHandler;
                            process.ErrorDataReceived  += errorHandler;

                            try
                            {
                                process.Start();

                                process.BeginOutputReadLine();
                                process.BeginErrorReadLine();

                                if (document.Html != null)
                                {
                                    using (var stream = process.StandardInput)
                                    {
                                        byte[] buffer = Encoding.UTF8.GetBytes(document.Html);
                                        stream.BaseStream.Write(buffer, 0, buffer.Length);
                                        stream.WriteLine();
                                    }
                                }

                                if (process.WaitForExit(environment.Timeout) && outputWaitHandle.WaitOne(environment.Timeout) && errorWaitHandle.WaitOne(environment.Timeout))
                                {
                                    if (process.ExitCode != 0 && !File.Exists(outputPdfFilePath))
                                    {
                                        throw new PdfConvertException(String.Format("Html to PDF conversion of '{0}' failed. Wkhtmltopdf output: \r\n{1}", document.Url, error));
                                    }
                                }
                                else
                                {
                                    if (!process.HasExited)
                                    {
                                        process.Kill();
                                    }

                                    throw new PdfConvertTimeoutException();
                                }
                            }
                            finally
                            {
                                process.OutputDataReceived -= outputHandler;
                                process.ErrorDataReceived  -= errorHandler;
                            }
                        }
                }


                if (woutput.OutputStream != null)
                {
                    using (Stream fs = new FileStream(outputPdfFilePath, FileMode.Open))
                    {
                        byte[] buffer = new byte[32 * 1024];
                        int    read;

                        while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            woutput.OutputStream.Write(buffer, 0, read);
                        }
                    }
                }

                if (woutput.OutputCallback != null)
                {
                    byte[] pdfFileBytes = File.ReadAllBytes(outputPdfFilePath);
                    woutput.OutputCallback(document, pdfFileBytes);
                }
            }
            finally
            {
                if (delete && File.Exists(outputPdfFilePath))
                {
                    File.Delete(outputPdfFilePath);
                }
            }
        }