TateChuYoko.cs
  1. //
  2. // This code is part of Document Solutions for Imaging demos.
  3. // Copyright (c) MESCIUS inc. All rights reserved.
  4. //
  5. using System;
  6. using System.IO;
  7. using System.Drawing;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using GrapeCity.Documents.Drawing;
  11. using GrapeCity.Documents.Text;
  12. using GrapeCity.Documents.Imaging;
  13. using GCTEXT = GrapeCity.Documents.Text;
  14. using GCDRAW = GrapeCity.Documents.Drawing;
  15.  
  16. namespace DsImagingWeb.Demos
  17. {
  18. // This sample demonstrates how to render short upright Latin text or numbers
  19. // in a block of vertical text. This is used in Chinese, Japanese and
  20. // Korean vertical text. In CSS this is referred to using the Japanese
  21. // name 縦中横 (tate chu yoko). To achieve this in GcGraphics,
  22. // the TextFormat.UprightInVerticalText property should be set.
  23. // A number of other properties on TextLayout and TextFormat
  24. // allow fine-tuning the behavior, as shown in this sample.
  25. public class TateChuYoko
  26. {
  27. public GcBitmap GenerateImage(Size pixelSize, float dpi, bool opaque, string[] sampleParams = null)
  28. {
  29. var bmp = new GcBitmap(pixelSize.Width, pixelSize.Height, opaque, dpi, dpi);
  30. using (var g = bmp.CreateGraphics(Color.White))
  31. {
  32.  
  33. var fntJp = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "YuGothM.ttc"));
  34. var fntLat = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "MyriadPro-Cond.otf"));
  35. var hiliteFore = Color.DarkSlateBlue;
  36. var hiliteBack = Color.FromArgb(unchecked((int)0xffffff99));
  37.  
  38. var tl = g.CreateTextLayout();
  39.  
  40. // Set text flow and other layout properties:
  41. tl.FlowDirection = FlowDirection.VerticalRightToLeft;
  42. tl.MaxWidth = g.Width;
  43. tl.MaxHeight = g.Height;
  44. tl.MarginAll = g.Resolution;
  45. tl.ParagraphSpacing = 12;
  46. tl.LineSpacingScaleFactor = 1.4f;
  47.  
  48. // g.FillRectangle(
  49. // new RectangleF(tl.MarginLeft, tl.MarginTop, tl.MaxWidth.Value - tl.MarginLeft - tl.MarginRight, tl.MaxHeight.Value - tl.MarginTop - tl.MarginBottom),
  50. // Color.AliceBlue);
  51.  
  52. // Text format for upright text (short Latin words or numbers)
  53. // (GlyphWidths turns on corresponding font features, but makes a difference
  54. // only of those features are present in the font):
  55. var fUpright = new TextFormat()
  56. {
  57. Font = fntLat,
  58. FontSize = 14,
  59. UprightInVerticalText = true,
  60. GlyphWidths = GlyphWidths.QuarterWidths,
  61. TextRunAsCluster = true,
  62. };
  63. // Text format for vertical Japanese and sideways Latin text:
  64. var fVertical = new TextFormat(fUpright)
  65. {
  66. Font = fntJp,
  67. UprightInVerticalText = false,
  68. GlyphWidths = GlyphWidths.Default,
  69. TextRunAsCluster = false,
  70. };
  71.  
  72. // Make sure runs of sideways text do not affect vertical spacing:
  73. fVertical.UseVerticalLineGapForSideways = true;
  74. // This commented fragment effectively would do the same as the
  75. // UseVerticalLineGapForSideways property setting above:
  76. /*
  77. var scale = fVertical.FontSize * tl.FontScaleFactor / fntJp.UnitsPerEm;
  78. if (!fVertical.FontSizeInGraphicUnits)
  79. scale *= tl.Resolution / 72f;
  80. fVertical.LineGap = fntJp.VerticalLineGap * scale;
  81. */
  82.  
  83. // Two additional text formants for highlighted headers:
  84. var fUpHdr = new TextFormat(fUpright)
  85. {
  86. ForeColor = hiliteFore,
  87. BackColor = hiliteBack
  88. };
  89. var fVertHdr = new TextFormat(fVertical)
  90. {
  91. ForeColor = hiliteFore,
  92. BackColor = hiliteBack
  93. };
  94.  
  95. tl.Append("PDF", fUpright);
  96. tl.Append("ファイルをコードから", fVertical);
  97. tl.Append("API", fUpright);
  98. tl.Append("を利用することで操作できます。クロスプラットフォーム環境で動作するアプリケーションの開発を支援する", fVertical);
  99. tl.Append("API", fUpright);
  100. tl.Append("ライブラリです。", fVertical);
  101.  
  102. // Smaller font size for the rest of the text:
  103. fUpright.FontSize -= 2;
  104. fVertical.FontSize -= 2;
  105.  
  106. // Item 1
  107. tl.AppendParagraphBreak();
  108. tl.Append("PDF", fUpHdr);
  109. tl.Append("用の包括的な", fVertHdr);
  110. tl.Append("API", fUpHdr);
  111.  
  112. tl.AppendSoftBreak();
  113. tl.Append("PDF", fUpright);
  114. tl.Append("バージョン「", fVertical);
  115. tl.Append("1.7", fUpright);
  116. tl.Append("」に準拠した", fVertical);
  117. tl.Append("API", fUpright);
  118. tl.Append("を提供し、レイアウトや機能を損なうことなく、豊富な機能を備えた", fVertical);
  119. tl.Append("PDF", fUpright);
  120. tl.Append("文書を生成、編集、保存できます。", fVertical);
  121.  
  122. // Item 2
  123. tl.AppendParagraphBreak();
  124. tl.Append("完全なテキスト描画", fVertHdr);
  125.  
  126. tl.AppendSoftBreak();
  127. tl.Append("PDF", fUpright);
  128. tl.Append("文書にテキストの描画情報が保持されます。テキストと段落の書式、特殊文字、複数の言語、縦書き、テキスト角度などが保持さるので、完全な形でテキスト描画を再現できます。", fVertical);
  129.  
  130. // Item 3
  131. tl.AppendParagraphBreak();
  132. tl.Append(".NET Standard 2.0 準拠", fVertHdr);
  133.  
  134. tl.AppendSoftBreak();
  135. tl.Append(".NET Core、.NET Framework、Xamarinで動作するアプリケーションを開発できます。Windows、macOS、Linuxなどクロスプラットフォーム環境で動作可能です。", fVertical);
  136.  
  137. // Item 4
  138. tl.AppendParagraphBreak();
  139. tl.Append("100", fUpHdr);
  140. tl.Append("を超える", fVertHdr);
  141. tl.Append("PDF", fUpHdr);
  142. tl.Append("操作機能", fVertHdr);
  143.  
  144. tl.AppendSoftBreak();
  145. tl.Append("ページの追加や削除、ページサイズ、向きの変更だけでなく、ファイルの圧縮、", fVertical);
  146. tl.Append("Web", fUpright);
  147. tl.Append("に最適化した", fVertical);
  148. tl.Append("PDF", fUpright);
  149. tl.Append("の生成など高度な機能も", fVertical);
  150. tl.Append("API", fUpright);
  151. tl.Append("操作で実現します。また、署名からセキュリティ機能まで様々な機能を含んだ", fVertical);
  152. tl.Append("PDF", fUpright);
  153. tl.Append("フォームを生成可能です。", fVertical);
  154.  
  155. // Item 5
  156. tl.AppendParagraphBreak();
  157. tl.Append("高速、軽量アーキテクチャ", fVertHdr);
  158.  
  159. tl.AppendSoftBreak();
  160. tl.Append("軽量", fVertical);
  161. tl.Append("API", fUpright);
  162. tl.Append("アーキテクチャでメモリと時間を節約できます。", fVertical);
  163. tl.AppendSoftBreak();
  164. tl.Append("また、他の生成用ツールに依存せずドキュメントを生成可能です。", fVertical);
  165.  
  166. // 6
  167. tl.AppendParagraphBreak();
  168. tl.Append("クラウドアプリケーション展開", fVertHdr);
  169. tl.Append("", fUpHdr);
  170.  
  171. tl.AppendSoftBreak();
  172. tl.Append("Azure、AWSなどのサービスに配置するクラウドアプリケーションの開発で利用可能です。仮想マシン、コンテナ、サーバーレスなどの方法で配置できます。", fVertical);
  173.  
  174. tl.PerformLayout(true);
  175. g.DrawTextLayout(tl, PointF.Empty);
  176. }
  177. // Done:
  178. return bmp;
  179. }
  180. }
  181. }
  182.