Beispiel #1
0
        /// <summary>
        /// PDF保存開始処理
        /// </summary>
        private void StartMakingPdf()
        {
            nsIWebBrowserPrint      print       = Xpcom.QueryInterface <nsIWebBrowserPrint>(gecko.Window.DomWindow);
            nsIPrintSettingsService prtService  = Xpcom.GetService <nsIPrintSettingsService>("@mozilla.org/gfx/printsettings-service;1");
            nsIPrintSettings        prtSettings = prtService.GetNewPrintSettingsAttribute();

            prtSettings.SetToFileNameAttribute(tempPdf);        // 保存PDFファイル名
            prtSettings.SetPrintSilentAttribute(true);          // サイレントモード
            prtSettings.SetShowPrintProgressAttribute(false);   // 印刷進捗非表示

            prtSettings.SetPaperHeightAttribute(297.0 * ipm);   // 高さ設定 A4
            prtSettings.SetPaperWidthAttribute(210.0 * ipm);    // 幅設定  A4

            prtSettings.SetMarginTopAttribute(5.08 / mpi);      // 上余白設定
            prtSettings.SetMarginBottomAttribute(5.18 / mpi);   // 下余白
            prtSettings.SetMarginLeftAttribute(5.08 / mpi);     // 左余白
            prtSettings.SetMarginRightAttribute(5.1 / mpi);     // 右余白

            prtSettings.SetHeaderStrLeftAttribute("");          // ヘッダー 左
            prtSettings.SetHeaderStrCenterAttribute("");        // ヘッダー 中
            prtSettings.SetHeaderStrRightAttribute("");         // ヘッダー 右
            prtSettings.SetFooterStrLeftAttribute("");          // フッター 左
            prtSettings.SetFooterStrCenterAttribute("");        // フッター 中
            prtSettings.SetFooterStrRightAttribute("");         // フッター 右
            prtSettings.SetDownloadFontsAttribute(false);

            prtSettings.SetPrintBGColorsAttribute(true);
            prtSettings.SetPrintBGImagesAttribute(true);

            prtSettings.SetOrientationAttribute(nsIPrintSettingsConsts.kPortraitOrientation);   // 用紙向き
            prtSettings.SetOutputFormatAttribute(nsIPrintSettingsConsts.kOutputFormatPDF);      // 保存フォーマット PDF

            print.Print(prtSettings, this);
            finishedTimer.Enabled = true;
        }
        private void FinishMakingPdf()
        {
            if (_conversionOrder.ReportMemoryUsage)
            {
                Console.WriteLine("Making the PDF took {0}", DateTime.Now - _startMakingPdf);
                MemoryManagement.CheckMemory(false, "Memory use after printing", false);
            }
            if (_conversionOrder.ReduceMemoryUse)
            {
                if (!File.Exists(_currentFile))
                {
                    throw new ApplicationException(string.Format(
                                                       "GeckoFxHtmlToPdf was not able to create the PDF file ({0}).{1}{1}Details: Gecko did not produce the expected document.",
                                                       _currentFile, Environment.NewLine));
                }
                // collect all the memory we can between pages
                GC.Collect();
                GC.WaitForPendingFinalizers();
                MemoryService.MinimizeHeap(true);
                _browser.Window.WindowUtils.GarbageCollect(null /*hopefully nulls ok*/, 0);

                var length = new FileInfo(_currentFile).Length;
                if (IsPrintingFinished(length))
                {
                    CombinePageFilesTogether();
                    if (_conversionOrder.ReportMemoryUsage)
                    {
                        MemoryManagement.CheckMemory(false, "Memory use after combining all the pages", false);
                        Console.WriteLine("Making all the PDF pages took {0}", DateTime.Now - _beginPages);
                    }
                    RaiseFinished();
                    return;
                }
                ++_currentPage;
                _printSettings.SetStartPageRangeAttribute(_currentPage);
                _printSettings.SetEndPageRangeAttribute(_currentPage);
                _currentFile = String.Format("{0}-page{1:000}", _pathToTempPdf, _currentPage);
                _printSettings.SetToFileNameAttribute(_currentFile);
                _finished       = false;
                _startMakingPdf = DateTime.Now;
                Status          = String.Format("Making Page {0} of PDF...", _currentPage);
                RaiseStatusChanged(new PdfMakingStatus()
                {
                    percentage = 0, statusLabel = Status
                });
                _print.Print(_printSettings, this);
                _checkForPdfFinishedTimer.Enabled = true;
                return;
            }

            if (!File.Exists(_pathToTempPdf))
            {
                throw new ApplicationException(string.Format(
                                                   "GeckoFxHtmlToPdf was not able to create the PDF file ({0}).{1}{1}Details: Gecko did not produce the expected document.",
                                                   _pathToTempPdf, Environment.NewLine));
            }

            try
            {
                File.Move(_pathToTempPdf, _conversionOrder.OutputPdfPath);
                RaiseFinished();
            }
            catch (IOException e)
            {
                // We can get here for a different reason: the source file is still in use
                throw new ApplicationException(
                          string.Format(
                              "Tried to move the file {0} to {1}, but the Operating System said that one of these files was locked. Please try again.{2}{2}Details: {3}",
                              _pathToTempPdf, _conversionOrder.OutputPdfPath, Environment.NewLine, e.Message));
            }
        }
        private void StartMakingPdf()
        {
            _print = Xpcom.QueryInterface <nsIWebBrowserPrint>(_browser.Window.DomWindow);

            var service = Xpcom.GetService <nsIPrintSettingsService>("@mozilla.org/gfx/printsettings-service;1");

            _printSettings = service.GetNewPrintSettingsAttribute();

            _printSettings.SetToFileNameAttribute(_pathToTempPdf);
            _printSettings.SetPrintToFileAttribute(true);
            _printSettings.SetPrintSilentAttribute(true);             //don't show a printer settings dialog
            _printSettings.SetShowPrintProgressAttribute(false);

            if (_conversionOrder.PageHeightInMillimeters > 0)
            {
                _printSettings.SetPaperHeightAttribute(_conversionOrder.PageHeightInMillimeters);
                _printSettings.SetPaperWidthAttribute(_conversionOrder.PageWidthInMillimeters);
                _printSettings.SetPaperSizeUnitAttribute(1);                 //0=in, >0 = mm
            }
            else
            {
                //doesn't actually work.  Probably a problem in the geckofx wrapper. Meanwhile we just look it up from our small list
                //printSettings.SetPaperNameAttribute(_conversionOrder.PageSizeName);

                var          size = GetPaperSize(_conversionOrder.PageSizeName);
                const double inchesPerMillimeter = 0.0393701;                   // (or more precisely, 0.0393700787402)
                _printSettings.SetPaperHeightAttribute(size.HeightInMillimeters * inchesPerMillimeter);
                _printSettings.SetPaperWidthAttribute(size.WidthInMillimeters * inchesPerMillimeter);
            }

            // BL-2346: On Linux the margins were not being set correctly due to the "unwritable margins"
            //          which were defaulting to 0.25 inches.
            _printSettings.SetUnwriteableMarginTopAttribute(0d);
            _printSettings.SetUnwriteableMarginBottomAttribute(0d);
            _printSettings.SetUnwriteableMarginLeftAttribute(0d);
            _printSettings.SetUnwriteableMarginRightAttribute(0d);

            //this seems to be in inches, and doesn't have a unit-setter (unlike the paper size ones)
            const double kMillimetersPerInch = 25.4;             // (or more precisely, 25.3999999999726)

            _printSettings.SetMarginTopAttribute(_conversionOrder.TopMarginInMillimeters / kMillimetersPerInch);
            _printSettings.SetMarginBottomAttribute(_conversionOrder.BottomMarginInMillimeters / kMillimetersPerInch);
            _printSettings.SetMarginLeftAttribute(_conversionOrder.LeftMarginInMillimeters / kMillimetersPerInch);
            _printSettings.SetMarginRightAttribute(_conversionOrder.RightMarginInMillimeters / kMillimetersPerInch);

            _printSettings.SetOrientationAttribute(_conversionOrder.Landscape ? 1 : 0);
            _printSettings.SetHeaderStrCenterAttribute("");
            _printSettings.SetHeaderStrLeftAttribute("");
            _printSettings.SetHeaderStrRightAttribute("");
            _printSettings.SetFooterStrRightAttribute("");
            _printSettings.SetFooterStrLeftAttribute("");
            _printSettings.SetFooterStrCenterAttribute("");

            _printSettings.SetPrintBGColorsAttribute(true);
            _printSettings.SetPrintBGImagesAttribute(true);

            _printSettings.SetShrinkToFitAttribute(false);


            //TODO: doesn't seem to do anything. Probably a problem in the geckofx wrapper
            //printSettings.SetScalingAttribute(_conversionOrder.Zoom);

            _printSettings.SetOutputFormatAttribute(2);             // 2 == kOutputFormatPDF

            Status = "Making PDF..";
            if (_conversionOrder.FirstPageToPrint > 0)
            {
                _printSettings.SetPrintRangeAttribute(1);                       // print only a range of pages
                if (_conversionOrder.LastPageToPrint < _conversionOrder.FirstPageToPrint)
                {
                    _conversionOrder.LastPageToPrint = _conversionOrder.FirstPageToPrint;
                }
                _printSettings.SetStartPageRangeAttribute(_conversionOrder.FirstPageToPrint);
                _printSettings.SetEndPageRangeAttribute(_conversionOrder.LastPageToPrint);
            }
            else if (_conversionOrder.ReduceMemoryUse)
            {
                _printSettings.SetPrintRangeAttribute(1);                       // print a range of pages
                _printSettings.SetStartPageRangeAttribute(1);
                _printSettings.SetEndPageRangeAttribute(1);
                _currentPage = 1;
                _currentFile = String.Format("{0}-page{1:000}", _pathToTempPdf, _currentPage);
                _printSettings.SetToFileNameAttribute(_currentFile);
                _beginPages = DateTime.Now;
                Status      = "Making Page 1 of PDF...";
            }

            _startMakingPdf = DateTime.Now;
            _print.Print(_printSettings, this);
            _checkForPdfFinishedTimer.Enabled = true;
        }