欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

unity 转Pdf

程序员文章站 2024-03-18 17:53:58
...

unity生成pdf格式,首先需要导入iTextSharp.dll ,下面是我写的一些方法,可以直接用.直接贴代码,

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using iTextSharp.text.pdf;
using iTextSharp.text;
using System.Text.RegularExpressions;
using System.Data.OracleClient;
using System;
 
//需要用到的数据结构
public class PdfUserInformation 
{
    public string goodsName;   
    public string youzhanType; 
    public string cvsLevel;    
    public string writeTime;    
    public string creater;      
    public string creatTime;   
};
//数据结构
public  class PdfInformation
{
	public string mID;
	public string mName;
	public string mReserve; 
	//  ....
};
 
public class PDFMakerManager  {
	
	public static PDFMakerManager PDFInstance;
	public static PDFMakerManager createPDFMakerManager()
	{
		if(PDFInstance==null)
		{
			PDFInstance = new PDFMakerManager ();
		}
		
		return PDFInstance;
	}
	
	//获取物品的子物体名字 通过子物体的名字获取物体  返回物体的链表
    public List<PdfInformation> getObjChildsName(Transform mParentObj) 
    {
       
        if(mParentObj!=null)
        {
            List<string> mChildObjs = new List<string>();
            List<PdfInformation> mInfoList = new List<PdfInformation>();
            foreach (Transform mChildTransform in mParentObj)
            {
                mChildObjs.Add(mChildTransform.gameObject.name);
                Debug.Log(mChildTransform.gameObject.name);
            }
            //获取  数据库  信息
            getPdfDatasFromDB();
            //通过子物体的名字 获取物体信息
            for (int i = 0; i < mChildObjs.Count; i++)
            {
                mInfoList.Add(mDirectoryData[mChildObjs[i]]);
            }
            return mInfoList;
        }
        return null;
    }
    //每行五个  还有问题,由于需求以及时间关系,没时间去管了   谁看到了可以帮忙解决下,.thanks
    List<PdfInformation> mGoodsInfoList = new List<PdfInformation>();
    public List<List<PdfInformation>> getAllGoods(List<PdfInformation> mList) 
    {
        List<List<PdfInformation>> mGoodsAll = new List<List<PdfInformation>>();
        List<List<PdfInformation>> mGoods = new List<List<PdfInformation>>();
 
        for (int i = 1; i <= mList.Count;i++ )
        {
            mGoodsInfoList.Add(mList[i-1]);
           
            if(i%5==0)
            {
               
                mGoodsAll.Add(mGoodsInfoList);
                Debug.Log("xx"+mGoodsInfoList.Count);
                mGoodsInfoList.Clear();
                
                for (int j = 0; j < mGoodsAll.Count; j++)
                {
                    Debug.Log("InfoList [[[" + j + "]]]is:" + mGoodsAll[j].Count);
                }
               
            }else if(i%5!=0&&i==mList.Count)
            {
                 mGoodsAll.Add(mGoodsInfoList);
                 mGoodsInfoList.Clear();
            }
        }
        Debug.Log("InfoList [[[is:" + mGoodsAll.Count);
        //for (int j = 0; j < mGoodsAll.Count;j++ )
        //{
        //    Debug.Log("InfoList [[[" + j + "]]]is:" + mGoodsAll[j].Count);
        //}
       
        return mGoodsAll;   
    }
    //从数据库  获取  PDF 信息
    Dictionary<string, PdfInformation> mDirectoryData = new Dictionary<string, PdfInformation>();
    public List<PdfInformation> getPdfDatasFromDB() 
    {
        List<PdfInformation> mInfoList = new List<PdfInformation>();
      
        Oracle   mDB = new Oracle ();
        try 
        {
            string mSearch = "select * from mdb";
            mInfoList = mDB.Select(mSearch);
            mDirectoryData = mDB.getPdfDictionary();
        }catch(Exception e)
        {
            mDB.Close();
            Debug.Log("sql error");
        }
       return mInfoList;
    }
 
//	/ pdf 行
	public PdfPTable CreateRankGoodsInforMationTable(List<List<PdfInformation>> mList)
	{
		 PdfPTable mTable=new PdfPTable(1);
		
	     mTable.SetTotalWidth(new float[]{300});
   		 
		
		 mTable.HorizontalAlignment = PdfPTable.LINECANVAS;
		
         if(mList.Count>0)
		 {
		     for(int i=0;i<mList.Count;i++)
			 {
                 Debug.Log("xx"+i+"xxxxxx:"+mList[i].Count);
				// mTable.AddCell(CreateCell(CreateRowGoodsInforMationTable2(mList[i]),-1,0));
			 }
			
		 }
 
         mTable.LockedWidth = true;
		 return mTable;
	}
//
	//pdf 列 
	 PdfPTable CreateRowGoodsInforMationTable2(System.Collections.Generic.List<PdfInformation> mList)
	{
		PdfPTable mTable =new PdfPTable (mList.Count);
		System.Collections.Generic.List<float> Width = new System.Collections.Generic.List<float> ();
		if(mList.Count>0)
		{
			for(int i=0;i<mList.Count;i++)
			{
				Width.Add(80f);
			}
		}
		float []mWidth = Width.ToArray();
		mTable.HorizontalAlignment = PdfPTable.BACKGROUNDCANVAS;
		
        if (mWidth[0] != -1)
        {
            mTable.SetTotalWidth(mWidth);
        }
        mTable.LockedWidth = true;
		for(int i=0;i<mList.Count;i++)
		{
			
			mTable.AddCell(CreateGoodsInformationCell(mList[i]));
		}
		mList.Clear();
		return mTable;
	}
 
    //pdf  图 暂时没用
     byte[] GoodsImgPrint(Camera SmallCamera,GameObject TakeHuoJia) 
    {
        int swidth = (int)(SmallCamera.WorldToScreenPoint(TakeHuoJia.transform.position + TakeHuoJia.renderer.bounds.size).x - SmallCamera.WorldToScreenPoint(TakeHuoJia.transform.position - TakeHuoJia.renderer.bounds.size).x);
 
        RenderTexture rt = new RenderTexture(Screen.width, resHeight, 72);
        SmallCamera.pixelRect = new Rect(0, 0, Screen.width, Screen.height);
        SmallCamera.targetTexture = rt;
        Texture2D screenShot = new Texture2D(swidth + 100, resHeight, TextureFormat.ARGB32, false);
        SmallCamera.Render();
        RenderTexture.active = rt;
 
        screenShot.ReadPixels(new Rect(SmallCamera.WorldToScreenPoint(TakeHuoJia.transform.position - TakeHuoJia.renderer.bounds.size).x, 0, swidth + 100, resHeight), 0, 0);
        screenShot.Apply();
        SmallCamera.targetTexture = null;
        RenderTexture.active = null; //
        UnityEngine.Object.Destroy(rt);
        byte[] bytes = screenShot.EncodeToPNG();
 
        return bytes;
    }
     //打印物品详细信息 图 (左边字  右边图 分开的  ,写法一:pdf字和摄像头图) 
     public void PrintGoodsInformations2(string filePath, Camera mCam, GameObject mObj, PdfUserInformation mInfo)
     {
         Document document = new Document(new Rectangle(PageSize.A4.Height, PageSize.A4.Width));
         PdfWriter.GetInstance(document, new FileStream(filePath, FileMode.Create));
         document.Open();
 
         PdfPTable tableAll = tableAll = CreateTable(2, PdfPTable.BACKGROUNDCANVAS, new float[] { document.PageSize.Width / 2 - 50, document.PageSize.Width / 2 - 50 }, true);
         //
         PdfPTable tableLeft = PrintGoodsInformations_Left(mInfo);
 
         Image tableRight = MakeCameraImg(mCam, 512, 512);//Image.GetInstance( GoodsImgPrint(mCam,mObj));
      
         tableAll.AddCell(CreateCell(tableLeft, -1, 0));
         tableAll.AddCell(CreateCell(tableRight, -1, 0));
         document.Add(tableAll);
         document.Close();
         ShowTips.showTips("  打印完成!文件保存在:" + filePath);
     }
     //打印物品详细信息 图   (左边字  右边图 分开的  ,写法2:摄像头全图,包括字和图) 
    public void PrintGoodsInformations(string filePath, Camera mCam,GameObject mObj,PdfUserInformation mInfo) 
    {
        Document document = new Document(new Rectangle(PageSize.A4.Height, PageSize.A4.Width));
        PdfWriter.GetInstance(document, new FileStream(filePath, FileMode.Create));
        document.Open();
 
        PdfPTable tableAll = CreateTable(1, PdfPTable.BACKGROUNDCANVAS, new float[] {document.PageSize.Width -100 }, true);
        //
        PdfPTable tableLeft = PrintGoodsInformations_Left(mInfo);
 
        Image tableRight = MakeCameraImg(mCam,680,512);//Image.GetInstance( GoodsImgPrint(mCam,mObj));
    
       // tableAll.AddCell(CreateCell(tableLeft, -1, 0));
        tableAll.AddCell(CreateCell(tableRight, -1, 0));
        document.Add(tableAll);
        document.Close();
        ShowTips.showTips("  打印完成!文件保存在:" + filePath);
    }
 
 
    //打印物品详细信息  左边字 右边字
    public void PrintGoodsInformations(string filePath,PdfUserInformation mInfo) 
    {
        Document document = new Document(new Rectangle(PageSize.A4.Height,PageSize.A4.Width));
        PdfWriter.GetInstance(document,new FileStream(filePath,FileMode.Create));
        document.Open();
 
        PdfPTable tableAll = CreateTable(2, PdfPTable.BACKGROUNDCANVAS, new float[] { document.PageSize.Width / 2 - 50, document.PageSize.Width / 2 - 50 }, true);
        //
        PdfPTable tableLeft = PrintGoodsInformations_Left(mInfo);
 
        //测试数据  ....
        PdfInformation mInfo1 = new PdfInformation();
        mInfo1.mName = "aaaa";
        PdfInformation mInfo2 = new PdfInformation();
        mInfo2.mName = "bbbbb";
 
        List<PdfInformation> mInfoList = new List<PdfInformation>();
        mInfoList.Add(mInfo1);
        mInfoList.Add(mInfo2);
 
        PdfInformation mInfo3 = new PdfInformation();
        mInfo3.mName = "ccccc";
        PdfInformation mInfo4 = new PdfInformation();
        mInfo4.mName = "ddddd";
 
        List<PdfInformation> mInfoList2 = new List<PdfInformation>();
        mInfoList2.Add(mInfo3);
        mInfoList2.Add(mInfo4);
 
        List<List<PdfInformation>> mLLInfo = new List<List<PdfInformation>>();
        mLLInfo.Add(mInfoList);
        mLLInfo.Add(mInfoList2);
 
        //.......
 
 
        //测试数据  数据库数据
       // List<List<PdfInformation>> mDBTestList = new List<List<PdfInformation>>();
        //mDBTestList = getAllGoods(getPdfDatasFromDB());
 
        //Debug.Log("DBList is:"+mDBTestList.Count);
        //......
 
 
        PdfPTable tableRight = CreateRankGoodsInforMationTable(mDBTestList);
        tableRight.HorizontalAlignment = PdfPTable.BACKGROUNDCANVAS;
        tableAll.AddCell(CreateCell(tableLeft, -1, 0));
        tableAll.AddCell(CreateCell(tableRight,-1,0));
        document.Add(tableAll);
        document.Close();
        ShowTips.showTips("  打印完成!文件保存在:" + filePath);
 
    }
    //详细信息的左半部分
    PdfPTable PrintGoodsInformations_Left(PdfUserInformation mInfo) 
    {
        PdfPTable tableHeaderR = CreateTable(1, PdfPTable.BACKGROUNDCANVAS, new float[] { -1 }, false);
        PdfPTable tableHeaderminiR = CreateTable(2, PdfPTable.BACKGROUNDCANVAS, new float[] { 1, 3 }, false);
 
        Image mark = Image.GetInstance(Application.dataPath + "/Icon.png");
        mark.ScaleAbsolute(250, 250);
        mark.Alignment = Image.LEFT_BORDER;
        tableHeaderminiR.AddCell(CreateCell(mark, 2, 0));//<<<<<<<<<
 
        //tableHeaderminiR.AddCell(CreateCell("商品", -1, 0, CreateFont(32, iTextSharp.text.Font.NORMAL)));//<<<<<<<<
        tableHeaderminiR.AddCell(CreateCell("标题", -1, 0, CreateFont(32, iTextSharp.text.Font.NORMAL)));//<<<<<<<<
        tableHeaderminiR.AddCell(CreateCell("xxx", -1, 0, CreateFont(22, iTextSharp.text.Font.NORMAL)));//<<<<<<<<
 
        PdfPTable tableDataR = CreateTable(1, PdfPTable.BACKGROUNDCANVAS, new float[] { 350 }, true);
        tableDataR.AddCell(CreateCell("\n", -1, 0, CreateFont(12, iTextSharp.text.Font.NORMAL)));
        tableDataR.AddCell(CreateCell("名称:\n", -1, -1, CreateFont(22, iTextSharp.text.Font.NORMAL)));
        tableDataR.AddCell(CreateCell(mInfo.goodsName, -1, -1, CreateFont(20, iTextSharp.text.Font.NORMAL)));
        tableDataR.AddCell(CreateCell("类型:\n", -1, -1, CreateFont(22, iTextSharp.text.Font.NORMAL)));
        tableDataR.AddCell(CreateCell(mInfo.youzhanType, -1, -1, CreateFont(20, iTextSharp.text.Font.NORMAL)));
        tableDataR.AddCell(CreateCell("级别:\n", -1, -1, CreateFont(22, iTextSharp.text.Font.NORMAL)));
        tableDataR.AddCell(CreateCell(mInfo.cvsLevel, -1, -1, CreateFont(20, iTextSharp.text.Font.NORMAL)));
        tableDataR.AddCell(CreateCell("时间:\n", -1, -1, CreateFont(22, iTextSharp.text.Font.NORMAL)));
        tableDataR.AddCell(CreateCell(mInfo.writeTime, -1, -1, CreateFont(20, iTextSharp.text.Font.NORMAL)));
        tableDataR.AddCell(CreateCell("创建者:", -1, -1, CreateFont(22, iTextSharp.text.Font.NORMAL)));
        tableDataR.AddCell(CreateCell(mInfo.creater, -1, -1, CreateFont(20, iTextSharp.text.Font.NORMAL)));
        tableDataR.AddCell(CreateCell("创建时间:\n", -1, -1, CreateFont(22, iTextSharp.text.Font.NORMAL)));
        tableDataR.AddCell(CreateCell(mInfo.creatTime, -1, -1, CreateFont(20, iTextSharp.text.Font.NORMAL)));
        tableHeaderR.AddCell(CreateCell(tableHeaderminiR, -1, 0));//<<<<<<<<
        tableHeaderR.AddCell(CreateCell(tableDataR, -1, 0));
 
 
        return tableHeaderR;
    }
 
 
    //把摄像头视野 制作成png图片
    private Rect CutRect = new Rect(0, 0, 1, 1);
    private int resWidth = 710;
    private int resHeight = 512;
    private  Image MakeCameraImg(Camera mCam,int width,int height) 
    {
        Image mImage;
        RenderTexture rt = new RenderTexture(width, height, 2);
        mCam.pixelRect = new Rect(0, 0, Screen.width, Screen.height);
        mCam.targetTexture = rt;
        Texture2D screenShot = new Texture2D((int)(width * CutRect.width), (int)(height * CutRect.height),
                                                 TextureFormat.RGB24, false);
        mCam.Render();
        RenderTexture.active = rt;
        screenShot.ReadPixels(new Rect(width * CutRect.x, width * CutRect.y, width * CutRect.width, height * CutRect.height), 0, 0);
        mCam.targetTexture = null;
        RenderTexture.active = null;
        UnityEngine.Object.Destroy(rt);
        byte[] bytes = screenShot.EncodeToPNG();
        //string filename = Application.dataPath + "/Print/3D"
          //                  + System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".png";
        //System.IO.File.WriteAllBytes(filename, bytes);
 
        mImage = Image.GetInstance(bytes);
        return mImage;
 
    }
    //打印图片 (摄像头视野看到的/生成的图片) 成PDF
    public  void PrintImgPdf(string filePath, Camera mCam)
    {
        Document document = new Document(new Rectangle(PageSize.A4.Height, PageSize.A4.Width));
        PdfWriter.GetInstance(
         document,
          new FileStream(filePath, FileMode.Create)
        );
        
        document.Open();
        Image imge;
        imge = MakeCameraImg(mCam,700,512);
        PdfPTable tableAll = CreateTable(1, PdfPTable.BACKGROUNDCANVAS, new float[] { document.PageSize.Width -50}, true);
        PdfPTable tableHeaderR = CreateTable(1, PdfPTable.BACKGROUNDCANVAS, new float[] { -1 }, false);
        PdfPTable tableHeaderminiR = CreateTable(1, PdfPTable.BACKGROUNDCANVAS, new float[] { 1 }, false);
        //
        Image mark = imge;
        mark.ScaleAbsolute(mark.Width, mark.Height);
        mark.Alignment = Image.LEFT_BORDER;
        tableHeaderminiR.AddCell(CreateCell(mark, 2, 0));//<<<<<<<<<
 
        tableHeaderR.AddCell(CreateCell(tableHeaderminiR, -1, 0));//<<<<<<<<
        tableAll.AddCell(CreateCell(tableHeaderR, -1, 0));//<<<<<<<<
 
        document.Add(tableAll);
        document.Close();
        ShowTips.showTips("  打印完成!文件保存在:" + filePath);
 
    }
	public PdfPTable CreateTable(int numCol, int HorizontalAlignmentStyle, float[] Width, bool isLockedWidth) 
    {
        PdfPTable tableAll = new PdfPTable(numCol);
        tableAll.HorizontalAlignment = HorizontalAlignmentStyle;
        if (Width[0] != -1)
        {
            tableAll.SetTotalWidth(Width);
        }
        tableAll.LockedWidth = isLockedWidth;
        return tableAll;
    }
 
    public PdfPCell CreateCell(PdfPTable table, int rowspan, int borderStyle)
    {
        PdfPCell cell = new PdfPCell(table);
        if (borderStyle != -1 && borderStyle >= 0)
        {
            cell.Border = borderStyle;
        }
        if (rowspan != -1) 
        {
            cell.Rowspan = rowspan;
        }
       
        cell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
        cell.VerticalAlignment = PdfPCell.ALIGN_LEFT | PdfPCell.ALIGN_CENTER;
        return cell;
    }
 
    public  PdfPCell CreateCell(Image image, int rowspan, int borderStyle)
    {
        PdfPCell cell = new PdfPCell(image);
        if (borderStyle != -1 && borderStyle >= 0)
        {
            cell.Border = borderStyle;
        }
        if (rowspan != -1)
        {
            cell.Rowspan = rowspan;
        }
        cell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
        cell.VerticalAlignment =  PdfPCell.ALIGN_BASELINE;
        return cell;
    }
 
    public PdfPCell CreateCell(string text, int rowspan, int borderStyle, iTextSharp.text.Font cellFont)
    {
        PdfPCell cell = new PdfPCell(new Phrase(text, cellFont));
        if (borderStyle != -1 && borderStyle>=0) 
        {
            cell.Border = borderStyle;
        }
        if (rowspan != -1)
        {
            cell.Rowspan = rowspan;
        }
       
        cell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
        cell.VerticalAlignment = PdfPCell.ALIGN_CENTER;
        return cell;
    }
	/// <summary>  只在详细信息的时候用
	 PdfPCell CreateGoodsInformationCell(PdfInformation mInfo)
	{
 
        string text = mInfo.mName +"\n";
		iTextSharp.text.Font font =CreateFont(20, iTextSharp.text.Font.NORMAL);
		PdfPCell cell = new PdfPCell(new Phrase(text,font));
		cell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
		cell.VerticalAlignment = PdfPCell.ALIGN_LEFT;
		
		return cell;
		
	}
	/// </param>/
	
	public  void CellAddTable(PdfPCell cell,PdfPTable table)
    {
        cell.AddElement(table);
    }
	public iTextSharp.text.Font CreateFont(float fontSize, int fontStyle)
    {
          BaseFont bfChinese = BaseFont.CreateFont(
 
               Application.dataPath + "/font/MSYH.TTF",
               BaseFont.IDENTITY_H,
               BaseFont.NOT_EMBEDDED
 
            );
 
            return new iTextSharp.text.Font(bfChinese, fontSize, fontStyle); 
    }
	
	
	
}

下面是调用:

using UnityEngine;
using System.Collections;
 
public class PrintPdf : MonoBehaviour {
 
 
    //需要将这几个摄像头绑定对应的
    PDFMakerManager mPdfManager;
    public Camera m3DCamera;
    public Camera mHightCam;
    public GameObject mObj;
    public Camera mInfoCamera;
    string mPdfPath;
 
    public GameObject[] Texts = new GameObject[6];
    public string[] Textstext;
    PdfUserInformation mPDFUserInfo;
	// Use this for initialization
	void Start () {
      
        Textstext = new string[6];
        mPdfManager = new PDFMakerManager();
        mPDFUserInfo = new PdfUserInformation();
       
    }
	
	// Update is called once per frame
	void Update () {
	
	}
   
 
 
    void OnGUI() 
    {
 
        if (GUI.Button(new Rect(100, 100, 100, 40), "PdfInfoPrint"))
        {
          
            PrintInfoPdf();
        }
        if (GUI.Button(new Rect(300, 100, 100, 40), "PdfInfoImgPrint"))
        {
         
            PrintInfoImgPdf();
        }
        if (GUI.Button(new Rect(400, 100, 100, 40), "PdfHightPrint"))
        {
            PrintHightImgPdf();
        }
    }
 
    //  还需要把摄像头绑定对  
    //   把写字的物体绑定对
    //  在  调用函数  需要 找对 位置
    public void getText()
    {
        for (int i = 0; i < Texts.Length; i++)
        {
            Textstext[i] = Texts[i].GetComponent<UILabel>().text;
        }
        mPDFUserInfo.goodsName = Textstext[0];
        mPDFUserInfo.youzhanType = Textstext[1];
        mPDFUserInfo.cvsLevel = Textstext[2];
        mPDFUserInfo.writeTime = Textstext[3];
        mPDFUserInfo.creater = Textstext[4];
        mPDFUserInfo.creatTime = Textstext[5];
 
    }
    //打印  左边字 右边表格
    public void PrintInfoPdf() 
    {
        getText();
        mPdfManager.PrintGoodsInformations(mPdfPath,mPDFUserInfo);  
    }
	//打印  信息 图片 
	public void PrintInfoImgPdf() 
    {
 
        getText();
		mPdfPath = Application.dataPath + "/Print/InfoImg"
                         + System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".pdf";
		
        mPdfManager.PrintGoodsInformations(mPdfPath, mInfoCamera, mObj, mPDFUserInfo);
 
		
    }
   
    //打印 图
    public void PrintHightImgPdf() 
    {
		mPdfPath = Application.dataPath + "/Print/Top"
                         + System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".pdf";
        mPdfManager.PrintImgPdf(mPdfPath, mHightCam);
		
    }
}
相关标签: unity随笔 unity