2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

[C#] PDF 출력하기 with PDFSharp

C#에서 PDF를 출력하는 방법은 여러가지가 있는 듯 하다.
걍 바로 PDF를 생성하는 방법 (설정?? 포맷을 지정하는 등 귀찮음)과, md(마크언어)를 사용해서 HTML로 변환 후, 그걸 출력하는 방법 (마크언어를 알면 포맷지정이나 디자인 필요없음) 등등이 있는 듯 하다.
나는 가장 많이 쓰인다는 PDFSharp 라이브러리를 사용해봤다.
Nuget에서 PDFSharp 라고 검색해서 인스톨 하면 바로 사용이 가능함.

문제는, 일본어...ㅠㅠ
일본어 폰트가 없거나 설정을 해 주지 않으면 개행문자가 깨져버려서 제대로 출력이 안됨.
기본적으로 사용되는 일본어폰트도 쉽게 깨지므로 번거롭지만 폰트를 프로젝트에 추가한 후, 프로퍼티에서 폰트를 프로젝트에 포함시킨 후 , PDFSharp 에서 제공하는 GlobalFontSettings.FontResolver 개체를 사용해야 함.
(한국어는 안해봐서 모르겠지만 비슷하지 않을까..)

폰트추가 하는 방법 및 글로벌폰트 설정하는 방법은 아래 문서를 참조했음.

using System;
// 필요한 라이브러리 추가
using PdfSharp;
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
using PdfSharp.Drawing.Layout;
using PdfSharp.Fonts;

namespace FourTypesApp
{
    public partial class typeinfo_uc_form : UserControl
    {
        // 필요없는 코드는 생략
        // 일본어 폰트를 사용하기 위한 Resolver를 Implement 함.
        public class JapaneseFontResolver : IFontResolver
        {
            // 공개무료폰트를 다운로드 해서 프로젝트에 추가한 후, 경로를 지정함.
            private static readonly string GEN_SHIN_GOTHIC_MEDIUM_TTF =
                "FourTypesApp.fonts.GenShinGothic-Monospace-Medium.ttf";
            // 폰트를 로드함.
            public byte[] GetFont(string faceName)
            {
                switch (faceName)
                {
                    case "GenShinGothic#Medium":
                        return LoadFontData(GEN_SHIN_GOTHIC_MEDIUM_TTF);
                }
                return null;
            }
            public FontResolverInfo ResolveTypeface(
                        string familyNamebool isBoldbool isItalic)
            {
                var fontName = familyName.ToLower();

                switch (fontName)
                {
                    case "gen shin gothic":
                        return new FontResolverInfo("GenShinGothic#Medium");
                }

                // 디폴트 폰트. 혹시 로딩이 안되거나 폰트파일이 없는 경우 사용됨.
                return PlatformFontResolver.ResolveTypeface("Arial"isBoldisItalic);
            }

            // 프로젝트 리스소로부터 폰트정보를 읽어옴.
            private byte[] LoadFontData(string resourceName)
            {
                var assembly = Assembly.GetExecutingAssembly();

                using (Stream stream = assembly.GetManifestResourceStream(resourceName))
                {
                    if (stream == null)
                        throw new ArgumentException("No resource with name " + resourceName);

                    int count = (int)stream.Length;
                    byte[] data = new byte[count];
                    stream.Read(data0count);
                    return data;
                }
            }
        }

        private void typeinfo_uc_form_Load(object senderEventArgs e)
        {
            switch (member.TypeId)
            {
                case 1:
                    lb_type.Text = "~「" + this.member.UserName + "」さんの体質診断結果~ \n <Dry(乾)> タイプです。"
                    pb_type.Image = FourTypesApp.Properties.Resources.dry_img;
                    pb_bedge.Image = FourTypesApp.Properties.Resources.img_dry;
                    richTextBox.Text = FourTypesApp.Properties.Resources.memo_dry;
                    break;
                // 이하 생략, 목표는 richTextBox에 리소스에 저장된 문자열을 표시한 후, 이 내용을 PDF로 출력하는 것임.
            }
        }

        private void btn_pdf_Click(object senderEventArgs e)
        {
            // PDF 출력버튼을 눌렀을 때 실행되는 코드
            try
            {
                // 일본어 폰트를 사용하기 위해서 글로벌폰트설정 개체를 생성함
                PdfSharp.Fonts.GlobalFontSettings.FontResolver = new JapaneseFontResolver();

                // PDF문서를 생성
                PdfDocument document = new PdfDocument();
                document.Info.Title = "四象体質診断結果";
                document.Info.Author = this.member.UserName;

                // 문서에 공백인 페이지를 추가한다.
                PdfPage page = document.AddPage();

                // 페이지에 출력을 하기 위한 Graphics개체를 설정함.
                XGraphics gfx = XGraphics.FromPdfPage(page);

                // 폰트를 설정함.
                var pdf_ja_font_options = new XPdfFontOptions(PdfFontEncoding.UnicodePdfFontEmbedding.Always);
                var pdf_ja_font_title = new XFont("Gen Shin Gothic"14XFontStyle.Boldpdf_ja_font_options);
                var pdf_ja_font = new XFont("Gen Shin Gothic"12XFontStyle.Regularpdf_ja_font_options);

                // 타이틀 문자열을 출력함.
                gfx.DrawString(lb_type.Textpdf_ja_font_titleXBrushes.Black,
                new XRect(3030page.Widthpage.Height), XStringFormats.TopCenter);

                // 내용 문자열의 포멧을 설정함. (이걸 안 하면 개행이 안 됨.)
                XTextFormatter tf = new XTextFormatter(gfx);
                tf.Alignment = XParagraphAlignment.Left;

                // 내용 텍스트를 출력함.
                tf.DrawString(richTextBox.Textpdf_ja_fontXBrushes.Black,
                new XRect(3080page.Widthpage.Height), XStringFormats.TopLeft);

                // 문서파일명을 설정함.
                string FileName = "FourTypeResult_" + this.member.UserName + ".pdf";

                // 문서파일을 저장함.
                document.Save(FileName);

                // PDF 뷰어로 작성한 문서를 표시함.
                Process.Start(FileName);
            }
            catch (Exception
            {
                throw new Exception();
            }
        }
    }
}

댓글

이 블로그의 인기 게시물

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

[C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

[react-native] uuid 생성이 에러가 날 때 대처법