SHOW:
|
|
- or go back to the newest paste.
| 1 | - | // |
| 1 | + | |
| 2 | - | // GhostscriptViewerPdfFormatHandler.cs |
| 2 | + | |
| 3 | - | // This file is part of Ghostscript.NET library |
| 3 | + | |
| 4 | - | // |
| 4 | + | |
| 5 | - | // Author: Josip Habjan ([email protected], http://www.linkedin.com/in/habjan) |
| 5 | + | |
| 6 | - | // Copyright (c) 2013-2014 by Josip Habjan. All rights reserved. |
| 6 | + | |
| 7 | - | // |
| 7 | + | |
| 8 | - | // Author ported some parts of this code from GSView. |
| 8 | + | |
| 9 | - | // |
| 9 | + | |
| 10 | - | // Permission is hereby granted, free of charge, to any person obtaining |
| 10 | + | |
| 11 | - | // a copy of this software and associated documentation files (the |
| 11 | + | |
| 12 | - | // "Software"), to deal in the Software without restriction, including |
| 12 | + | |
| 13 | - | // without limitation the rights to use, copy, modify, merge, publish, |
| 13 | + | |
| 14 | - | // distribute, sublicense, and/or sell copies of the Software, and to |
| 14 | + | |
| 15 | - | // permit persons to whom the Software is furnished to do so, subject to |
| 15 | + | |
| 16 | - | // the following conditions: |
| 16 | + | |
| 17 | - | // |
| 17 | + | |
| 18 | - | // The above copyright notice and this permission notice shall be |
| 18 | + | |
| 19 | - | // included in all copies or substantial portions of the Software. |
| 19 | + | |
| 20 | - | // |
| 20 | + | |
| 21 | - | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| 21 | + | |
| 22 | - | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| 22 | + | |
| 23 | - | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| 23 | + | |
| 24 | - | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
| 24 | + | |
| 25 | - | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
| 25 | + | |
| 26 | - | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
| 26 | + | |
| 27 | - | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| 27 | + | |
| 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 | } |