private DSCToken ReadUntill(string prefix, DSCTokenEnding end) { int c; DSCToken token = new DSCToken(); token.StartPosition = _bufferedStream.Position - prefix.Length; StringBuilder text = new StringBuilder(prefix, 64); int lastAppendedChar = 0; while ((c = _bufferedStream.ReadByte()) > -1) { if (c == '\n' && (end & DSCTokenEnding.LineEnd) == DSCTokenEnding.LineEnd) { token.Length = _bufferedStream.Position - 1 - token.StartPosition; token.Text = text.ToString().Trim(); token.Ending = DSCTokenEnding.LineEnd; return(token); } else if (c == '\r' && _bufferedStream.ReadByte() == '\n' && (end & DSCTokenEnding.LineEnd) == DSCTokenEnding.LineEnd) { token.Length = _bufferedStream.Position - 2 - token.StartPosition; token.Text = text.ToString().Trim(); token.Ending = DSCTokenEnding.LineEnd; return(token); } else if (c == ' ' && text.Length > 0 && lastAppendedChar != ' ' && (end & DSCTokenEnding.Whitespace) == DSCTokenEnding.Whitespace) { token.Length = _bufferedStream.Position - 1 - token.StartPosition; token.Text = text.ToString().Trim(); token.Ending = DSCTokenEnding.Whitespace; return(token); } else { text.Append((char)c); lastAppendedChar = c; } } return(null); }
public override void ShowPage(int pageNumber) { this.CurrentPageNumber = pageNumber; DSCToken pageToken = _pageTokens[pageNumber]; DSCToken pageEndToken; if (pageNumber == _pageTokens.Count) { pageEndToken = _lastPageEnding; } else { pageEndToken = _pageTokens[pageNumber + 1]; } int pageSize = (int)(pageEndToken.StartPosition - pageToken.StartPosition); string pageContent = _tokenizer.ReadContent((int)pageToken.StartPosition, pageSize); this.Execute(pageContent); }
private void OpenPsFile(string path) { _tokenizer = new DSCTokenizer(path); this.FirstPageNumber = 1; DSCToken token = null; // loop through all DSC comments based on keyword while ((token = _tokenizer.GetNextDSCKeywordToken()) != null) { switch (token.Text) { case DSC_PAGES: // %%Pages: <numpages> | (atend) { token = _tokenizer.GetNextDSCValueToken(DSCTokenEnding.Whitespace | DSCTokenEnding.LineEnd); // check if we need to ignore this comment because it's set at the end of the file if (!string.IsNullOrWhiteSpace(token.Text) && token.Text != "(atend)" && !token.Text.StartsWith("%")) { // we got it, memorize it this.LastPageNumber = int.Parse(token.Text); } break; } case DSC_BOUNDINGBOX: // { %%BoundingBox: <llx> <lly> <urx> <ury> } | (atend) { try { DSCToken llx = _tokenizer.GetNextDSCValueToken(DSCTokenEnding.Whitespace | DSCTokenEnding.LineEnd); if (!string.IsNullOrWhiteSpace(llx.Text) && llx.Text != "(atend)" && !llx.Text.StartsWith("%")) { DSCToken lly = _tokenizer.GetNextDSCValueToken(DSCTokenEnding.Whitespace); DSCToken urx = _tokenizer.GetNextDSCValueToken(DSCTokenEnding.Whitespace); DSCToken ury = _tokenizer.GetNextDSCValueToken(DSCTokenEnding.Whitespace | DSCTokenEnding.LineEnd); this.BoundingBox = new GhostscriptRectangle( float.Parse(llx.Text, System.Globalization.CultureInfo.InvariantCulture), float.Parse(lly.Text, System.Globalization.CultureInfo.InvariantCulture), float.Parse(urx.Text, System.Globalization.CultureInfo.InvariantCulture), float.Parse(ury.Text, System.Globalization.CultureInfo.InvariantCulture)); } } catch { } break; } case DSC_PAGE: // %%Page: <label> <ordinal> { // label can be anything, we need to get oridinal which is the last // value of the line DSCToken pageNumberToken; // loop through each comment value while ((pageNumberToken = _tokenizer.GetNextDSCValueToken(DSCTokenEnding.Whitespace | DSCTokenEnding.LineEnd)) != null) { // check if this is the last comment value in this line if (pageNumberToken.Ending == DSCTokenEnding.LineEnd) { // we got it, add this comment keyword to the page list _pageTokens.Add(int.Parse(pageNumberToken.Text), token); break; } } break; } case DSC_TRAILER: // %%Trailer (no keywords) { // if the postscript is well formatted, we should get this one // save this comment so we can know the position when the last page is ending _lastPageEnding = token; break; } case DSC_EOF: // %%EOF (no keywords) { // check if we already know where the last page is ending if (_lastPageEnding == null) { // we don't know, use start of the %%EOF comment as the last page ending position _lastPageEnding = token; } break; } } } // check if we didn't find %%Trailer or %%EOF comment if (_lastPageEnding == null) { // it seems that the last page goes to the end of the file, set the last page ending // position to the complete file size value _lastPageEnding = new DSCToken(); _lastPageEnding.StartPosition = _tokenizer.FileSize; } // we did'n find %%Pages comment, set the last page number to 1 if (this.LastPageNumber == 0) { this.LastPageNumber = 1; } // check if we didn't find any %%Page comment if (_pageTokens.Count == 0) { // create dummy one that will point to the first byte in the file _pageTokens.Add(1, new DSCToken() { StartPosition = 0 }); } // hpd = Header, Procedure definitions, Document setup // start position of the first %%Page: comment is te hpd size int hpdSize = (int)_pageTokens[1].StartPosition; // get the hpd text string hpdContent = _tokenizer.ReadContent(0, hpdSize); // process header, procedure definitions and document setup if (string.IsNullOrWhiteSpace(hpdContent)) { hpdContent = "%!PS-Adobe-3.0"; } this.Execute(hpdContent); }
public override void Open(string filePath) { _content = File.ReadAllText(filePath); int i = _content.IndexOf("%!"); if (i > 0) { _content = _content.Substring(i, _content.Length - i - 1); } i = _content.IndexOf("%%EOF"); if (i > -1) { _content = _content.Substring(0, i + 5); } if (this.Viewer.EPSClip) { unsafe { fixed(char *p = _content) { UnmanagedMemoryStream ums = new UnmanagedMemoryStream((byte *)p, _content.Length); DSCTokenizer tokenizer = new DSCTokenizer(ums, true, BitConverter.IsLittleEndian); DSCToken token = null; while ((token = tokenizer.GetNextDSCKeywordToken()) != null) { if (token.Text == "%%BoundingBox:") { try { DSCToken v1 = tokenizer.GetNextDSCValueToken(DSCTokenEnding.Whitespace | DSCTokenEnding.LineEnd); DSCToken v2 = tokenizer.GetNextDSCValueToken(DSCTokenEnding.Whitespace | DSCTokenEnding.LineEnd); DSCToken v3 = tokenizer.GetNextDSCValueToken(DSCTokenEnding.Whitespace | DSCTokenEnding.LineEnd); DSCToken v4 = tokenizer.GetNextDSCValueToken(DSCTokenEnding.Whitespace | DSCTokenEnding.LineEnd); this.BoundingBox = new GhostscriptRectangle( float.Parse(v1.Text, System.Globalization.CultureInfo.InvariantCulture), float.Parse(v2.Text, System.Globalization.CultureInfo.InvariantCulture), float.Parse(v3.Text, System.Globalization.CultureInfo.InvariantCulture), float.Parse(v4.Text, System.Globalization.CultureInfo.InvariantCulture)); } catch { } break; } } tokenizer.Dispose(); tokenizer = null; ums.Close(); ums.Dispose(); ums = null; } } } this.FirstPageNumber = 1; this.LastPageNumber = 1; }