Advertisement
trolman5678

ghost

Oct 2nd, 2016
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Drawing;
  3.  
  4. namespace Ghostscript.NET.Viewer
  5. {
  6.     internal class GhostscriptViewerPdfFormatHandler : GhostscriptViewerFormatHandler
  7.     {
  8.         #region Private constants
  9.  
  10.         private const string PDF_TAG = "%GSNET";
  11.         private const string PDF_PAGES_TAG = "%GSNET_VIEWER_PDF_PAGES: ";
  12.         private const string PDF_PAGE_TAG = "%GSNET_VIEWER_PDF_PAGE: ";
  13.         private const string PDF_MEDIA_TAG = "%GSNET_VIEWER_PDF_MEDIA: ";
  14.         private const string PDF_CROP_TAG = "%GSNET_VIEWER_PDF_CROP: ";
  15.         private const string PDF_ROTATE_TAG = "%GSNET_VIEWER_PDF_ROTATE: ";
  16.         private const string PDF_DONE_TAG = "%GSNET_VIEWER_PDF_DONE: ";
  17.         private const string PDF_MARK_TAG = "%GSNET_VIEWER_PDF_MARK: ";
  18.  
  19.         #endregion
  20.  
  21.         #region Constructor
  22.  
  23.         public GhostscriptViewerPdfFormatHandler(GhostscriptViewer viewer) : base(viewer) { }
  24.  
  25.         #endregion
  26.  
  27.         #region Initialize
  28.  
  29.         public override void Initialize()
  30.         {
  31.             // define our routine for preparing to show a page.  
  32.             // This writes out some tags which we capture in the
  33.             // callback to obtain the page size and orientation.
  34.             this.Execute(string.Format(@"
  35.                /GSNETViewer_PDFpage {{
  36.                     ({0}) print dup == flush
  37.                     pdfgetpage /Page exch store
  38.                    Page /MediaBox pget
  39.                    {{ ({1}) print == flush  }}
  40.                     if
  41.                    Page /CropBox pget
  42.                     {{ ({2}) print == flush }}
  43.                     if
  44.                    Page /Rotate pget not {{ 0 }} if
  45.                     ({3}) print == flush
  46.                }} def", PDF_PAGE_TAG, PDF_MEDIA_TAG, PDF_CROP_TAG, PDF_ROTATE_TAG));
  47.  
  48.             // put these in userdict so we can write to them later
  49.             this.Execute(@"
  50.                    /Page null def
  51.                    /Page# 0 def
  52.                    /PDFSave null def
  53.                    /DSCPageCount 0 def
  54.                ");
  55.  
  56.             // open PDF support dictionaries
  57.             this.Execute(@"
  58.                    GS_PDF_ProcSet begin
  59.                    pdfdict begin");
  60.         }
  61.  
  62.         #endregion
  63.  
  64.         #region Open
  65.  
  66.         public override void Open(string filePath)
  67.         {          
  68.             // open PDF file
  69.             this.Execute(string.Format("({0}) (r) file pdfopen begin", filePath.Replace("\\", "/")));
  70.  
  71.             this.Execute("/FirstPage where { pop FirstPage } { 1 } ifelse");
  72.             this.Execute("/LastPage where { pop LastPage } { pdfpagecount } ifelse");
  73.  
  74.             // flush stdout and then send PDF page marker to stdout where we capture the page numbers via callback
  75.             this.Execute(string.Format("flush ({0}) print exch =only ( ) print =only (\n) print flush", PDF_PAGES_TAG));
  76.         }
  77.  
  78.         #endregion
  79.  
  80.         #region StdInput
  81.  
  82.         public override void StdInput(out string input, int count)
  83.         {
  84.             input = string.Empty;
  85.         }
  86.  
  87.         #endregion
  88.  
  89.         #region StdOutput
  90.  
  91.         public override void StdOutput(string message)
  92.         {
  93.             if (message.Contains(PDF_TAG))
  94.             {
  95.                 int startPos = message.IndexOf(PDF_TAG);
  96.                 int endPos = message.IndexOf(": ");
  97.  
  98.                 string tag = message.Substring(startPos, endPos + 2);
  99.                 string rest = message.Substring(endPos + 2, message.Length - endPos - 2);
  100.  
  101.                 switch (tag)
  102.                 {
  103.                     case PDF_PAGES_TAG:
  104.                         {
  105.                             string[] pages = rest.Split(new char[] { ' ' });
  106.                             this.FirstPageNumber = int.Parse(pages[0]);
  107.                             this.LastPageNumber = int.Parse(pages[1]);
  108.                         }
  109.                         break;
  110.                     case PDF_PAGE_TAG:
  111.                         {
  112.                             this.CurrentPageNumber = int.Parse(rest);
  113.                             break;
  114.                         }
  115.                     case PDF_MEDIA_TAG:
  116.                         {
  117.                             string[] mb = rest.Split(new char[] { ' ' });
  118.                             this.MediaBox = new GhostscriptRectangle(
  119.                                     float.Parse(mb[0].TrimStart('['), System.Globalization.CultureInfo.InvariantCulture),
  120.                                     float.Parse(mb[1], System.Globalization.CultureInfo.InvariantCulture),
  121.                                     float.Parse(mb[2], System.Globalization.CultureInfo.InvariantCulture),
  122.                                     float.Parse(mb[3].TrimEnd(']'), System.Globalization.CultureInfo.InvariantCulture));
  123.                             break;
  124.                         }
  125.                     case PDF_CROP_TAG:
  126.                         {
  127.                             string[] cb = rest.Split(new char[] { ' ' });
  128.                             this.CropBox = new GhostscriptRectangle(
  129.                                     float.Parse(cb[0].TrimStart('['), System.Globalization.CultureInfo.InvariantCulture),
  130.                                     float.Parse(cb[1], System.Globalization.CultureInfo.InvariantCulture),
  131.                                     float.Parse(cb[2], System.Globalization.CultureInfo.InvariantCulture),
  132.                                     float.Parse(cb[3].TrimEnd(']'), System.Globalization.CultureInfo.InvariantCulture));
  133.  
  134.                             break;
  135.                         }
  136.                     case PDF_ROTATE_TAG:
  137.                         {
  138.                             int rotate = int.Parse(rest);
  139.  
  140.                             while (rotate < 0)
  141.                             {
  142.                                 rotate += 360;
  143.                             }
  144.  
  145.                             while (rotate >= 360)
  146.                             {
  147.                                 rotate -= 360;
  148.                             }
  149.                                
  150.                             switch (rotate)
  151.                             {
  152.                                 case 90:
  153.                                     this.PageOrientation = GhostscriptPageOrientation.Landscape;
  154.                                     break;
  155.                                 case 180:
  156.                                     this.PageOrientation = GhostscriptPageOrientation.UpsideDown;
  157.                                     break;
  158.                                 case 270:
  159.                                     this.PageOrientation = GhostscriptPageOrientation.Seascape;
  160.                                     break;
  161.                                 default:
  162.                                     this.PageOrientation = GhostscriptPageOrientation.Portrait;
  163.                                     break;
  164.                             }
  165.  
  166.                             break;
  167.                         }
  168.                 }
  169.             }
  170.         }
  171.  
  172.         #endregion
  173.  
  174.         #region StdError
  175.  
  176.         public override void StdError(string message)
  177.         {
  178.  
  179.         }
  180.  
  181.         #endregion
  182.  
  183.         #region InitPage
  184.  
  185.         public override void InitPage(int pageNumber)
  186.         {
  187.             if (pageNumber >= this.FirstPageNumber && pageNumber <= this.LastPageNumber)
  188.             {
  189.                 this.Execute(string.Format("{0} GSNETViewer_PDFpage", pageNumber));
  190.             }
  191.             else
  192.             {
  193.                 throw new GhostscriptException("Page number is not in pages number range!");
  194.             }
  195.         }
  196.  
  197.         #endregion
  198.  
  199.         #region ShowPage
  200.  
  201.         public override void ShowPage(int pageNumber)
  202.         {
  203.             if (pageNumber >= this.FirstPageNumber && pageNumber <= this.LastPageNumber)
  204.             {
  205.                 this.Execute("Page pdfshowpage_init pdfshowpage_finish");
  206.             }
  207.             else
  208.             {
  209.                 throw new GhostscriptException("Page number is not in pages number range!");
  210.             }
  211.         }
  212.  
  213.         #endregion
  214.  
  215.     }
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement