參考文檔 :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; } }
調用
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; } } }
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; } } }
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; } } }
調用

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 } } }