zoukankan      html  css  js  c++  java
  • unity3d导出pdf

    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("
    ", -1, 0, CreateFont(12, iTextSharp.text.Font.NORMAL)));
            tableDataR.AddCell(CreateCell("名称:
    ", -1, -1, CreateFont(22, iTextSharp.text.Font.NORMAL)));
            tableDataR.AddCell(CreateCell(mInfo.goodsName, -1, -1, CreateFont(20, iTextSharp.text.Font.NORMAL)));
            tableDataR.AddCell(CreateCell("类型:
    ", -1, -1, CreateFont(22, iTextSharp.text.Font.NORMAL)));
            tableDataR.AddCell(CreateCell(mInfo.youzhanType, -1, -1, CreateFont(20, iTextSharp.text.Font.NORMAL)));
            tableDataR.AddCell(CreateCell("级别:
    ", -1, -1, CreateFont(22, iTextSharp.text.Font.NORMAL)));
            tableDataR.AddCell(CreateCell(mInfo.cvsLevel, -1, -1, CreateFont(20, iTextSharp.text.Font.NORMAL)));
            tableDataR.AddCell(CreateCell("时间:
    ", -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("创建时间:
    ", -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 +"
    ";
    		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);
    		
        }
    }
    

    注:如需转载,请注明出处,

  • 相关阅读:
    生活重心
    做自己才对,想多只会徒增烦恼
    列下计划,一个个实现吧
    公司搬迁
    限制文件的类型
    总结
    mvc mvp mvvm区别
    sessionStorage
    localStorage点击次数存储
    2016.09.01 html5兼容
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3285563.html
Copyright © 2011-2022 走看看