using System; using System.Drawing; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; using CLR; using PDFPatcher.Common; namespace PDFPatcher.Functions { sealed partial class TextViewerForm : Form { static readonly Regex __EscapeChars = new Regex("[\u0000-\u001F\u0080-\u00FF]", RegexOptions.Compiled); readonly byte[] _Data; ///获取或指定文本内容是否只读。 public bool IsTextReadOnly { get => _TextBox.ReadOnly; set { _TextBox.ReadOnly = value; _OkButton.Visible = !value; _CancelButton.Text = value ? "关闭(&G)" : "取消(&X)"; } } ///获取或指定文本内容。 public string TextContent { get => _TextBox.Text; set => _TextBox.Text = value; } public TextViewerForm() { InitializeComponent(); } public TextViewerForm(byte[] data, bool isTextReadonly, bool isContentStream = false) : this() { _Data = data; _EncodingBox.SelectedIndex = 0; _ReformatButton.Visible = isContentStream; IsTextReadOnly = isTextReadonly; MinimumSize = Size; } static string EscapeChar(char c) { var t = Convert.ToString(c, 8); switch (t.Length) { case 1: return "\\00" + t; case 2: return "\\0" + t; default: return "\\" + t; } } void _EncodingBox_SelectedIndexChanged(object sender, EventArgs e) { if (!_Data.HasContent()) { _TextBox.Clear(); return; } Encoding en; switch (_EncodingBox.SelectedIndex) { case 0: en = Encoding.GetEncoding(936); break; case 1: en = Encoding.GetEncoding(1252); break; case 2: en = Encoding.UTF8; break; default: TextContent = ShowHexBin(); return; } TextContent = __EscapeChars.Replace(en.GetString(_Data), m => { var c = m.Value[0]; return c.CeqAny('\t', '\r', '\n') ? m.Value : EscapeChar(c); }); } string ShowHexBin() { return _Data.ToHexBinString(true, ' ', 0, _Data.Length); } void _ReformatButton_Click(object sender, EventArgs e) { if (!_Data.HasContent()) { return; } _TextBox.Clear(); _TextBox.BackColor = Color.FloralWhite; ContentStreamViewer.SetContent(_TextBox, _Data); _ReformatButton.Enabled = false; } } }