根據pdf模板文件添加數據生成新的pdf與pdf添加讀取二維碼


參考文檔 :https://www.cnblogs.com/ibeisha/p/itextsharp-pdf.html

程序demo 地址:https://github.com/hudean/itextsharpDemo

 

我這邊收到一份word版的文檔,首先,我們將其另存為PDF文件。其次,在https://www.pdfescape.com/open/這個網站,將PDF文件上傳上去,進行在線編輯。 

 

 

也可以通過PDF軟件工具,進行編輯。這里,我把需要填寫部分的內容,全畫上表單元素,設置元素的name,后面根據name 屬性對其進行賦值。具體操作,將text放置指定處,然后鼠標右鍵,看到如下界面:

 

 這里Name屬性就是后面我們要用到的。目前它支持的元素有:

 

 

1、使用itextsharp 生成pdf文件 引用itextsharp 包

DataTable 轉成pdf文件

 private static void Method()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(int));
            dt.Columns.Add("name", typeof(string));
            dt.Columns.Add("age", typeof(int));
            dt.Columns.Add("address", typeof(string));
            dt.Clear();
            DataRow dr = dt.NewRow();
            dr["id"] = 1; dr["name"] = "cscc"; dr["age"] = 26; dr["address"] = "江西省";
            dt.Rows.Add(dr);
            dt.AcceptChanges();
            bool b = ITextSharpHelper2.ConvertDataTableToPDF(dt, @"C:\Users\Administrator\Desktop\testPDF.pdf", "C://WINDOWS//FONTS//SIMSUN.TTC,1", 9);
            Console.WriteLine($"{b}");
            Console.ReadKey();
        }

ITextSharpHelper2幫助類

public class ITextSharpHelper2
    {
        /// <summary>
        /// 根據pdf模板寫入數據生成新的pdf
        /// </summary>
        /// <param name="saveFile">保存的新pdf路徑</param>
        /// <param name="sourceFile">原pdf路徑</param>
        public static void AddNewPdf(string saveFile, string sourceFile)
        {
            //寫入新的pdf地址
            //sourceFile = @"C:\Users\Administrator\Desktop\ABC\temp.pdf";
            //sourceFile = @"C:\Users\Administrator\Desktop\temp123.pdf";
            iTextSharp.text.pdf.PdfDocument document = new iTextSharp.text.pdf.PdfDocument();
            //讀取的源pdf文件
            iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(sourceFile);
            PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(saveFile, FileMode.OpenOrCreate));
            AcroFields pdfFormFields = pdfStamper.AcroFields;
            pdfStamper.FormFlattening = true;
            //BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            //BaseFont simheiBase = BaseFont.CreateFont(@"C:\Windows\Fonts\simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            BaseFont simheiBase = BaseFont.CreateFont(@"C:\Windows\Fonts\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            pdfFormFields.AddSubstitutionFont(simheiBase);
            Dictionary<string, string> para = new Dictionary<string, string>();
            para.Add($"Numbering", "12369999995");
            for (int i = 1; i < 38; i++)
            {
                para.Add($"Numbering{i}", "12365");
            }
            foreach (KeyValuePair<string, string> parameter in para)
            {
                pdfStamper.AcroFields.SetField(parameter.Key, parameter.Value);
            }
            //pdfStamper.AcroFields.SetField("Names", "李朝強");
            //pdfStamper.AcroFields.SetField("chk", "yes", true);
            pdfStamper.Close();
            pdfReader.Close();
        }

        /// <summary>
        /// pdf文件添加圖片
        /// </summary>
        /// <param name="oldPath">源PDF文件</param>
        /// <param name="newPath">新PDF文件</param>
        /// <param name="imPath">圖片地址</param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        public static void AddImg(string oldPath, string newPath, string imPath, float x, float y)
        {
            iTextSharp.text.pdf.PdfDocument doc = new iTextSharp.text.pdf.PdfDocument();


            iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(oldPath);
            PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newPath, FileMode.OpenOrCreate));
            //獲取PDF指定頁面內容
            var pdfContentByte = pdfStamper.GetOverContent(1);
            //添加圖片
            Image image = Image.GetInstance(imPath);

            //設置圖片大小
            image.ScaleToFit(100, 100);
            //設置圖片位置
            image.SetAbsolutePosition(x, y);
            pdfContentByte.AddImage(image);
            pdfStamper.FormFlattening = true;
            pdfStamper.Close();
            pdfReader.Close();

        }


        /// <summary>
        /// DataTable 轉成Pdf文件
        /// </summary>
        /// <param name="Data"></param>
        /// <param name="PDFFile"></param>
        /// <param name="FontPath"></param>
        /// <param name="FontSize"></param>
        /// <returns></returns>
        public static bool ConvertDataTableToPDF(DataTable Data, string PDFFile, string FontPath, float FontSize)
        {
            Document document = new Document();
            PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(PDFFile, FileMode.Create));
            document.Open();
            BaseFont baseFont =
                BaseFont.CreateFont(
                FontPath,
                BaseFont.IDENTITY_H,
                BaseFont.NOT_EMBEDDED);
            iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont, FontSize);
            PdfPTable table = new PdfPTable(Data.Columns.Count);
            for (int i = 0; i < Data.Rows.Count; i++)
            {
                for (int j = 0; j < Data.Columns.Count; j++)
                {
                    table.AddCell(new Phrase(Data.Rows[i][j].ToString(), font));
                }
            }
            document.Add(table);
            document.Close();
            writer.Close();
            return true;
        }

    }
View Code

調用

static void Main(string[] args)
        {
            #region  DataTable 轉成pdf文件

            // Method();
            #endregion

            #region 向pdf文件添加圖片

            //ITextSharpHelper2.AddImg(@"C:\Users\Administrator\Desktop\testPDF.pdf", @"C:\Users\Administrator\Desktop\tempPDF.pdf", @"C:\Users\Administrator\Desktop\QRCode.png", 300, 100);

            #endregion

            #region 向pdf模板文件添加數據

            ITextSharpHelper2.AddNewPdf(@"C:\Users\Administrator\Desktop\temp3.pdf", @"C:\Users\Administrator\Desktop\temp123.pdf");
            #endregion

            Console.ReadKey();
        }

(模板文件在程序的文件夾里,模板里要填的數據我在上面所有的屬性都填寫對應的名稱)

Zxing 生成讀取二維碼幫助類,引用ZXing 包

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZXing;
using ZXing.Common;
using ZXing.QrCode;

namespace QRCode
{
    public class ZxingHelper
    {
        /// <summary>
        /// 生成二維碼,保存成圖片
        /// </summary>
        public static void Generate1(string text, string filename)
        {
            BarcodeWriter writer = new BarcodeWriter();
            writer.Format = BarcodeFormat.QR_CODE;
            QrCodeEncodingOptions options = new QrCodeEncodingOptions();
            options.DisableECI = true;
            //設置內容編碼
            options.CharacterSet = "UTF-8";
            //設置二維碼的寬度和高度
            options.Width = 500;
            options.Height = 500;
            //設置二維碼的邊距,單位不是固定像素
            options.Margin = 1;
            writer.Options = options;

            Bitmap map = writer.Write(text);
            //string filename = @"H:\桌面\截圖\generate1.png";
            map.Save(filename, ImageFormat.Png);
            map.Dispose();
        }

        /// <summary>
        /// 生成條形碼
        /// </summary>
        /// <param name="text"></param>
        public static void Generate2(string text, string filename)
        {
            BarcodeWriter writer = new BarcodeWriter();
            //使用ITF 格式,不能被現在常用的支付寶、微信掃出來
            //如果想生成可識別的可以使用 CODE_128 格式
            //writer.Format = BarcodeFormat.ITF;
            writer.Format = BarcodeFormat.CODE_128;
            EncodingOptions options = new EncodingOptions()
            {
                Width = 150,
                Height = 50,
                Margin = 2
            };
            writer.Options = options;
            Bitmap map = writer.Write(text);
            //string filename = @"H:\桌面\截圖\generate2.png";
            map.Save(filename, ImageFormat.Png);
        }

        /// <summary>
        /// 讀取二維碼
        /// 讀取失敗,返回空字符串
        /// </summary>
        /// <param name="filename">指定二維碼圖片位置</param>
        public static string Read1(string filename)
        {
            BarcodeReader reader = new BarcodeReader();
            reader.Options.CharacterSet = "UTF-8";
            Bitmap map = new Bitmap(filename);
            Result result = reader.Decode(map);
            return result == null ? "" : result.Text;
        }
    }
}
View Code

 

ThoughtWorks 生成讀取二維碼幫助類,引用ThoughtWorks 包

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ThoughtWorks.QRCode.Codec;

namespace QRCode
{
    public  class ThoughtWorksHelper
    {

        /// <summary>
        /// ThoughtWorks.QRCode生成二維碼
        /// </summary>
        /// <param name="idStr">寫入二維碼的字符串</param>
        /// <param name="strSaveDir">保存的路徑</param>
        /// <param name="fileName">保存文件名稱例如 QRCode.png</param>
        /// <returns></returns>
        public static void QRCodeMehed(string idStr,string strSaveDir,string fileName)
        {
            QRCodeEncoder endocder = new QRCodeEncoder();
            //二維碼背景顏色
            endocder.QRCodeBackgroundColor = System.Drawing.Color.White;
            //二維碼編碼方式
            endocder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
            //每個小方格的寬度
            endocder.QRCodeScale = 10;
            //二維碼版本號
            endocder.QRCodeVersion = 5;
            //糾錯等級
            endocder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
            //var person = new { Id = 1, Name = "wolfy", Gender = 1, Age = 24 };
            //string idStr = "134165897456321";
            //將json川做成二維碼
            //Bitmap bitmap = endocder.Encode(new JavaScriptSerializer().Serialize(person), System.Text.Encoding.UTF8);
            Bitmap bitmap = endocder.Encode(idStr, System.Text.Encoding.UTF8);
            //string strSaveDir = @"C:\Users\Administrator\Desktop\ABC";//Request.MapPath("/QRcode/");
            if (!Directory.Exists(strSaveDir))
            {
                Directory.CreateDirectory(strSaveDir);
            }
            // string strSavePath = Path.Combine(strSaveDir, "QRCode" + ".png");
            string strSavePath = Path.Combine(strSaveDir, fileName);
            //System.IO.FileStream fs = new System.IO.FileStream(strSavePath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
            //bitmap.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
            if (!System.IO.File.Exists(strSavePath))
            {
                bitmap.Save(strSavePath);
            }
        }

        /// <summary>
        /// ThoughtWorks.QRCode解析二維碼
        /// </summary>
        /// <returns></returns>
        public static string DeCoder(string strSaveDir, string fileName)
        {
            string result = "";
            //string strSaveDir = @"C:\Users\Administrator\Desktop\ABC";//Request.MapPath("/QRcode/");
            fileName = "QRCode.png";
            if (!Directory.Exists(strSaveDir))
            {
                Directory.CreateDirectory(strSaveDir);
            }
            string strSavePath = Path.Combine(strSaveDir, fileName );
            if (System.IO.File.Exists(strSavePath))
            {
                QRCodeDecoder decoder = new QRCodeDecoder();
                result = decoder.decode(new ThoughtWorks.QRCode.Codec.Data.QRCodeBitmapImage(new Bitmap(Image.FromFile(strSavePath))));
            }

            return result;
        }
    }
}
View Code

 

Spire 讀取pfd文件和插入圖片和讀取pdf里的圖片 引用Spire包

using Spire.Pdf;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZXing;

namespace QRCode
{
    public class SpireHelper
    {
        //文檔地址 https://www.e-iceblue.cn/spirepdfnet/spire-pdf-for-net-program-guide-content.html


        /// <summary>
        /// Spire插件添加二維碼到PDF
        /// </summary>
        /// <param name="sourcePdf">pdf文件路徑</param>
        /// <param name="sourceImg">二維碼圖片路徑</param>
        public static void AddQrCodeToPdf(string sourcePdf, string sourceImg)
        {
            //初始化PdfDocument實例,導入PDF文件  
            Spire.Pdf.PdfDocument doc = new Spire.Pdf.PdfDocument();

            //加載現有文檔
            doc.LoadFromFile(sourcePdf);
            //添加一個空白頁,目的為了刪除jar包添加的水印,后面再移除這一頁  (沒有用)
            //PdfPageBase pb = doc.Pages.Add();
            //獲取第二頁
            //PdfPageBase page = doc.Pages[1];
            //獲取第1頁
            PdfPageBase page = doc.Pages[0];
            //加載圖片到Image對象
            Image image = Image.FromFile(sourceImg);

            //調整圖片大小
            int width = image.Width;
            int height = image.Height;
            float scale = 0.18f;  //縮放比例0.18f;
            Size size = new Size((int)(width * scale), (int)(height * scale));
            Bitmap scaledImage = new Bitmap(image, size);

            //加載縮放后的圖片到PdfImage對象
            Spire.Pdf.Graphics.PdfImage pdfImage = Spire.Pdf.Graphics.PdfImage.FromImage(scaledImage);

            //設置圖片位置
            float x = 516f;
            float y = 8f;

            //在指定位置繪入圖片
            //page.Canvas.DrawImage(pdfImage, x, y);
            page.Canvas.DrawImage(pdfImage, new PointF(x,y),size);
            //移除第一個頁
            //doc.Pages.Remove(pb); //去除第一頁水印
            //保存文檔
            doc.SaveToFile(@sourcePdf);
            doc.Close();
            //釋放圖片資源
            image.Dispose();
        }

        /// <summary>
        /// Spire插件讀取PDF中的二維碼並保存二維碼圖片
        /// </summary>
        /// <param name="file">pdf文件路徑</param>
        public static void QrCodeToPdf(string file,string fileImg)
        {
            //加載PDF文檔
            PdfDocument doc = new PdfDocument();
            doc.LoadFromFile(file);

            List<Image> listImages = new List<Image>();

            for (int i = 0; i < doc.Pages.Count; i++)
            {
                // 實例化一個Spire.Pdf.PdfPageBase對象
                PdfPageBase page = doc.Pages[i];

                // 獲取所有pages里面的圖片
                Image[] images = page.ExtractImages(true); //page.ExtractImages();
                if (images != null && images.Length > 0)
                {
                    listImages.AddRange(images);
                }

            }

            // 將提取到的圖片保存到本地路徑
            if (listImages.Count > 0)
            {
                for (int i = 0; i < listImages.Count; i++)
                {
                    Image image = listImages[i];
                    //image.Save(@"C:\Users\Administrator\Desktop\ABC\image" + (i + 3).ToString() + ".png", System.Drawing.Imaging.ImageFormat.Png);
                    image.Save(fileImg, System.Drawing.Imaging.ImageFormat.Png);
                }

            }
        }

        /// <summary>
        /// Spire插件讀取PDF中的二維碼,Zxing識別二維碼
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public static string QrCodeToPdftwo(string file)
        {
            string str = "";
            //加載PDF文檔
            PdfDocument doc = new PdfDocument();
            doc.LoadFromFile(file);

            List<Image> listImages = new List<Image>();

            for (int i = 0; i < doc.Pages.Count; i++)
            {
                // 實例化一個Spire.Pdf.PdfPageBase對象
                PdfPageBase page = doc.Pages[i];

                // 獲取所有pages里面的圖片
                Image[] images = page.ExtractImages();
                if (images != null && images.Length > 0)
                {
                    listImages.AddRange(images);
                }

            }

            if (listImages.Count > 0)
            {

                //QRCodeDecoder decoder = new QRCodeDecoder();
                //var image = listImages[0];
                //str = decoder.decode(new ThoughtWorks.QRCode.Codec.Data.QRCodeBitmapImage((Bitmap)image));

                var image = listImages[0];
                ZXing.BarcodeReader reader = new ZXing.BarcodeReader();
                reader.Options.CharacterSet = "UTF-8";
                Bitmap map = new Bitmap(image);
                Result result = reader.Decode(map);
                return result == null ? "" : result.Text;
            }

            return str;
        }
    }
}
View Code

 

調用 

using Spire.Pdf;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ThoughtWorks.QRCode.Codec;
using ZXing;
using ZXing.Presentation;

namespace QRCode
{
    class Program
    {
        static void Main(string[] args)
        {

            #region 使用ThoughtWorks 生成識別二維碼

            ////生成二維碼
            //ThoughtWorksHelper.QRCodeMehed("123598788", @"C:\Users\Administrator\Desktop\", "QRCode.png");

            ////解析二維碼
            //string str = ThoughtWorksHelper.DeCoder(@"C:\Users\Administrator\Desktop\", "QRCode.png");
            //Console.WriteLine(str);
            //Console.ReadKey();
            #endregion


            #region 使用Zxing 生成識別二維碼
            //生成二維碼
            //ZxingHelper.Generate1("8585855885",@"C:\Users\Administrator\Desktop\QRCode1.png");

            ////解析二維碼
            //string str = ZxingHelper.Read1(@"C:\Users\Administrator\Desktop\QRCode1.png");
            //Console.WriteLine(str);
            //Console.ReadKey();
            #endregion

            #region 使用Spire 向pdf添加二維碼或讀取pdf文件里的二維碼

            //文檔地址 https://www.e-iceblue.cn/spirepdfnet/spire-pdf-for-net-program-guide-content.html

            //向pdf添加二維碼
            //SpireHelper.AddQrCodeToPdf(@"C:\Users\Administrator\Desktop\testPDF.pdf", @"C:\Users\Administrator\Desktop\QRCode1.png");
            //在pdf讀取二維碼,並保存二維碼圖片
            //SpireHelper.QrCodeToPdf(@"C:\Users\Administrator\Desktop\testPDF.pdf", @"C:\Users\Administrator\Desktop\QRCode2.png");
            //在pdf讀取二維碼
            string str = SpireHelper.QrCodeToPdftwo(@"C:\Users\Administrator\Desktop\testPDF.pdf");
            Console.WriteLine(str);
            Console.ReadKey();
            #endregion
        }
    }
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM