Unity에서 iTextSharp로 PDF 만들기

11407 단어 UnityC#iText
Unity에서 PDF를 생성해야 하므로 여기서 사용하는 iTextSharp 라이브러리 가져오기 방법을 설명합니다.

iTextSharp 다운로드


iTextSharp는 AGPL-3.0License의 소스로 C#용 PDF로 생성된 라이브러리를 무료로 사용할 수 있다.Unity 5.6.4(Mac Edition)로 시험해 봤는데, 이것은 문제없이 사용할 수 있을 것 같다.
다음 NuGet 페이지에서 Manual download 링크를 클릭하십시오.nupkg 파일을 다운로드합니다.
iTextSharp
itextsharp.xmlworker
itextsharp.pdfa
itextsharp.xtra
다운로드 받았어요.nupkg의 확장자를 입력하십시오.zip으로 변경하여 해동하고 각자의 포장에서 dll를 꺼냅니다.

Unity 가져오기


Plugins 폴더를 만들고 꺼낸 4개의 dll(itextsharp.dll,itextsharp.pdfa.dll,itextsharp.xml worker.dll,itextsharp.xtra.dll)을 넣으세요.

PDF에 캡처 저장하기


PDFTest.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using System;

public class PDFTest : MonoBehaviour {

    public Camera mainCam;
    private Texture2D capturedTex;


    public void Start(){
        GeneratePDF();
    }


    public void GeneratePDF () {
        string path = Application.persistentDataPath + "/screenshot-"+System.DateTime.Now.ToString("yyy-MM-dd_HH-mm-ss")+".pdf";
        StartCoroutine(CreatePDF(path));
    }

    // create pdf to specific path
    public IEnumerator CreatePDF (string path) {
        Document doc = new Document(PageSize.A4.Rotate()); 

        var writer = PdfWriter.GetInstance(doc, new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None));


        doc.Open();
        doc.NewPage();

        yield return StartCoroutine(TakeScreenshot(mainCam, Screen.width, Screen.height));


        AddImageToPDF(writer, capturedTex, 0, 0);


        doc.Close();

    }

    // coroutine to take screenshot
    public IEnumerator TakeScreenshot (Camera cam, int width, int height) {

        RenderTexture rt = new RenderTexture(width, height, 24, RenderTextureFormat.ARGB32);
        rt.antiAliasing = 8; 
        cam.targetTexture = rt;
        cam.Render();

        yield return new WaitForEndOfFrame();

        RenderTexture.active = rt;

        capturedTex = new Texture2D(width, height, TextureFormat.RGB24, false);
        capturedTex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
        capturedTex.Apply();

        cam.targetTexture = null;
    }

    // add image to pdf
    public void AddImageToPDF(PdfWriter pdfWriter, Texture2D img, float posX, float posY){
        byte[] imageBytes = img.EncodeToPNG();
        iTextSharp.text.Image finalImage = iTextSharp.text.Image.GetInstance(imageBytes);
        finalImage.ScaleAbsolute(PageSize.A4.Rotate());
        finalImage.SetAbsolutePosition(posX, posY);

        var pdfContentByte = pdfWriter.DirectContent;
        pdfContentByte.AddImage(finalImage);
    }


}

PDF가 perrsistentDataPath 아래에 이렇게 저장됩니다.

총결산


게임에서 PDF의 시작은 별로 안 할 수도 있지만 유닛을 게임 이외의 목적으로 사용하는 사람들에게는 편리한 프로그램 라이브러리라고 생각합니다.

좋은 웹페이지 즐겨찾기