使用C#和 aspose.total 实现替换pdf中的文字(外语:捷克语言的pdf),并生成新的pdf导出到指定路径

程序主入口:

Program.cs

cs 复制代码
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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

            #region 单例模式
            Process[] allProcess = Process.GetProcesses();
            List<Process> prolist = new List<Process>();
            foreach (Process p in allProcess)
            {
                if (p.ProcessName.ToLower() == "pdfeditor")
                {
                    Console.WriteLine(p.StartTime.ToString() + p.ProcessName);
                    prolist.Add(p);
                }
            }
            Console.WriteLine("当前启动程序进程数:" + prolist.Count);
            if (prolist.Count > 1)
            {
                for (int m = 0; m < prolist.Count - 1; m++)
                {
                    try
                    {
                        for (int i = 0; i < prolist[m].Threads.Count; i++)
                            prolist[m].Threads[i].Dispose();
                        prolist[m].Kill();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                        continue;
                    }
                }
            }
            Console.WriteLine("启动中~~~请稍等~~");
            System.Threading.Thread.Sleep(10000);

            Process[] allProcess1 = Process.GetProcesses();
            List<Process> prolist1 = new List<Process>();
            foreach (Process p1 in allProcess1)
            {
                if (p1.ProcessName.ToLower() == "pdfeditor")
                {
                    Console.WriteLine(p1.StartTime.ToString() + p1.ProcessName);
                    prolist1.Add(p1);
                }
            }
            Console.WriteLine("进程杀死后,当前启动程序进程数:" + prolist1.Count);
            Console.WriteLine("线程开始 " + DateTime.Now.ToString());
            Console.WriteLine("开始删除无用的日志文件完成" + DateTime.Now.ToString());
            Log.DelateLog();
            Console.WriteLine("删除无用的日志文件完成" + DateTime.Now.ToString());
            #endregion



            try
            {
                //执行主业务逻辑
                HandlePdf.HandlePdfContent();

            }
            catch (Exception exception)
            {
                //任务失败,重启程序
                Log.WriteLog("run", exception.ToString());
                DateTime now = DateTime.Now;
                int SleepTime = int.Parse(ConfigurationManager.AppSettings["SleepTime"].ToString());
                Log.WriteLog("run", "替换出现异常,开始休眠" + SleepTime + "分钟.............." + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                while (DateTime.Now.AddMilliseconds(-60000.0 * SleepTime).CompareTo(now) <= 0)
                {
                }
                try
                {
                    Process.Start("pdfeditor");
                }
                catch (Exception ex)
                {
                    Log.WriteLog("run", ex.ToString());
                }
            }


        }
    }
}

pdf处理方法:

cs 复制代码


using Aspose.Pdf.Facades;
using Newtonsoft.Json;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PdfEditor
{
    public class HandlePdf
    {


        //休眠时间
        public static int SleepTime = int.Parse(ConfigurationManager.AppSettings["SleepTime"].ToString());
        public static string pdfpath = ConfigurationManager.AppSettings["pdfpath"];
        public static string newpdfpath = ConfigurationManager.AppSettings["newpdfpath"];
        public static string newpdftohtmlpath = ConfigurationManager.AppSettings["htmlpath"];
        public static string firstContent = ConfigurationManager.AppSettings["firstContent"];
        public static string secondContent = ConfigurationManager.AppSettings["secondContent"];
        public static string thirdContent = ConfigurationManager.AppSettings["thirdContent"];
        public static string fourthContent = ConfigurationManager.AppSettings["fourthContent"];
        /// <summary>
        /// 每到设定好的时间都会自动执行此程序
        /// </summary>
        public static void HandlePdfContent()
        {
            Log.WriteLog("run", "------------------------------------------------------------------------------------------------------------");
            Log.WriteLog("run", "************开始替换pdf数据************");
            Task[] tasks = new Task[1];
            tasks[0] = Task.Factory.StartNew(() => ExcuteHandle());
            Task.WaitAll(tasks);
            Log.WriteLog("run", "pdf数据替换完成,开始休眠" + SleepTime + "分钟..............");
            DateTime now = DateTime.Now;
            while (DateTime.Now.AddMilliseconds(-60000.0 * SleepTime).CompareTo(now) <= 0)
            {
            }


            #region 重复执行
            try
            {
                HandlePdfContent();
            }
            catch (Exception exception)
            {
                //任务失败,重启程序
                Log.WriteLog("run", exception.ToString());
                DateTime now1 = DateTime.Now;
                Log.WriteLog("run", "pdf替换出现异常,开始休眠" + SleepTime + "分钟.............." + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                while (DateTime.Now.AddMilliseconds(-60000.0 * SleepTime).CompareTo(now1) <= 0)
                {
                }
                try
                {
                    Process.Start("pdfeditor");
                }
                catch (Exception ex)
                {
                    Log.WriteLog("run", ex.ToString());
                }
            }
            #endregion
        }

        private static void ExcuteHandle()
        {
            List<string> resultList = GetAllFiles(pdfpath, null, ".pdf");
            if (resultList != null)
            {
                Log.WriteLog("run", "总共获取到符合条件的pdf文件有" + resultList.Count + "个");
                Log.WriteLog("run", "符合条件的pdf文件路径如下:【" + JsonConvert.SerializeObject(resultList) + "】");

                List<List<string>> arrays = new List<List<string>>();
                List<string> contains_str = new List<string>();
                foreach (var temp in resultList)
                {
                    string FileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(temp);
                    string queryCondition = FileNameWithoutExtension.Split('-')[0] + "-" + FileNameWithoutExtension.Split('-')[1]

                       + "-" + FileNameWithoutExtension.Split('-')[2];// +"-" + FileNameWithoutExtension.Split('-')[3];

                    if (!contains_str.Contains(queryCondition))
                    {
                        contains_str.Add(queryCondition);
                    }
                }
                foreach (var item in contains_str)
                {
                    var queryResults =
                                   from n in resultList
                                   where n.Contains(item)
                                   orderby n
                                   select n;
                    arrays.Add(queryResults.ToList());
                }
                foreach (var item in arrays)
                {
                    //添加文本域,返回新文件路径
                    string newpdfpath = AddTextField(item[0], item[1]);
                    //
                    EditPdfFiled(newpdfpath);
                    EditPdfFiled(item[1]);
                }
            }
        }

        private static string AddTextField(string item0, string item1)
        {
            string filenamewithoutextension = System.IO.Path.GetFileNameWithoutExtension(item1);
            string date = filenamewithoutextension.Split('-')[2];
            DateTime dt = DateTime.ParseExact(date, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
            string number = filenamewithoutextension.Split('-')[4];
            string newfilepath = pdfpath + newpdfpath;
            if (!Directory.Exists(newfilepath))
            {
                Directory.CreateDirectory(newfilepath);
            }
            string newfilename = System.IO.Path.GetFileName(item0);
            Spire.Pdf.PdfDocument document = new Spire.Pdf.PdfDocument();
            try
            {
                System.IO.TextReader tr = new StreamReader(System.AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["replaceTextPath"], Encoding.UTF8, true);

               
                document.LoadFromFile(item0);//新建黑色的画笔
                PdfPageBase page = document.Pages[0];
                PdfSolidBrush brush = new PdfSolidBrush(new PdfRGBColor(System.Drawing.Color.Black));

                //定义字体格式
                Spire.Pdf.Graphics.PdfTrueTypeFont font = new Spire.Pdf.Graphics.PdfTrueTypeFont(new Font("Arial", 10, System.Drawing.FontStyle.Bold), true);

                String strLine;
                while ((strLine = tr.ReadLine()) != null)
                {
                    if (strLine.Contains("bylo"))
                    {
                        //获取文本所在区域
                        System.Drawing.RectangleF rec = new System.Drawing.Rectangle(350, 70, 200, 200);
                        System.Drawing.PointF position = new System.Drawing.Point(350, 70);
                        //填充修改后的文本到文本域
                        page.Canvas.DrawString(strLine, font, brush, position);
                    }
                    if (strLine.Contains("dne"))
                    {
                        //获取文本所在区域
                        System.Drawing.RectangleF rec = new System.Drawing.Rectangle(350, 83, 200, 200);
                        System.Drawing.PointF position = new System.Drawing.Point(350, 83);
                        string str = strLine.Split(':')[0] + ": " + dt.ToString("dd") + "." + dt.ToString("MM") + "." + dt.ToString("yyyy");
                        //填充修改后的文本到文本域
                        page.Canvas.DrawString(str, font, brush, position);
                    }
                    if (strLine.Contains("DSId"))
                    {
                        //获取文本所在区域
                        System.Drawing.RectangleF rec = new System.Drawing.Rectangle(350, 94, 400, 200);
                        System.Drawing.PointF position = new System.Drawing.Point(350, 94);
                        string str = strLine.Split(':')[0] + ": " + strLine.Split(':')[1] + number;

                        //填充修改后的文本到文本域
                        page.Canvas.DrawString(str, font, brush, position);
                    }
                    if (strLine.Contains("Stav"))
                    {
                        //获取文本所在区域
                        System.Drawing.RectangleF rec = new System.Drawing.Rectangle(350, 105, 200, 200);
                        System.Drawing.PointF position = new System.Drawing.Point(350, 105);
                        string str = strLine.Split(':')[0] + ": " + strLine.Split(':')[1];
                        //填充修改后的文本到文本域
                        page.Canvas.DrawString(str, font, brush, position);
                    }

                }
                //保存文档
                document.SaveToFile(newfilepath + newfilename, FileFormat.PDF);
              
            }
            catch (Exception ex)
            {
                Log.WriteLog("run", "出现异常,异常信息为:【" + ex.Message + "】");
            } 
            document.Dispose();
            document.Close();
            return newfilepath + newfilename;
        }

        public static void EditPdfFiled(string pdffilepath)
        {
            try
            {
                string Key = "zhaowohuoqu";
                   new Aspose.Pdf.License().SetLicense(new MemoryStream(Convert.FromBase64String(Key)));
                string filename = System.IO.Path.GetFileName(pdffilepath);
                string newfilepath = pdfpath + newpdfpath;
                if (!Directory.Exists(newfilepath))
                {
                    Directory.CreateDirectory(newfilepath);
                }
                PdfContentEditor pdfContentEditor = new PdfContentEditor();
                pdfContentEditor.BindPdf(pdffilepath); 
                pdfContentEditor.ReplaceText("Beijing Tianyouyida Management Consulting Ltd Co", firstContent); 
                pdfContentEditor.ReplaceText("9 9 9 9 9 9 9 9 9 9", secondContent); 
                pdfContentEditor.ReplaceText("T i a n y o u  Z h o u / O p r á v n e n á  o s o b a", thirdContent); 
                pdfContentEditor.ReplaceText("T i a n y o u  Z h o u / a g e n t", fourthContent);
                pdfContentEditor.Save(newfilepath + filename); 
            }
            catch (Exception ex)
            {
                Log.WriteLog("run", "出现异常,异常信息为:【" + ex.Message + "】");
            }
        }


        private static List<string> GetAllFiles(string path, List<string> resultList, string extension)
        {
            if (resultList == null)
            {
                resultList = new List<string>();
            }
            System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(path);
            System.IO.FileInfo[] files = di.GetFiles();

            foreach (System.IO.FileInfo fi in files)
            {
                if (fi.Extension.ToLower() == extension)
                {
                    resultList.Add(fi.FullName);
                }
            }

            DirectoryInfo[] dirinfo = di.GetDirectories();

            for (int i = 0; i < dirinfo.Length; i++)
            {
                if (!dirinfo[i].FullName.Contains("newpdf"))
                {
                    GetAllFiles(dirinfo[i].FullName, resultList, ".pdf");
                }
            }

            return resultList;
        }

    }
}

配置文件:

cs 复制代码
<?xml version="1.0" encoding="utf-8"?>
<configuration>
	<appSettings>
		<!--pdf存放路径-->
		<add key="pdfpath" value="C:\Users\Administrator\Desktop\pdfeditor" />
		<!--休眠时间-->
		<add key="SleepTime" value="60" />
		<!--被替换pdf存放路径-->
		<add key="newpdfpath" value="/newpdf/" /> 
		<!--要替换的内容-->
		<add key="firstContent" value="Tianjin caiwu guanli gongsi" />
		<add key="secondContent" value="8888888888" />
		<add key="thirdContent" value="Mary Zhou/Agent" />
		<add key="fourthContent" value="Mary Zhou/Agent" />
		<add key="replaceTextPath" value="/需要添加文字.txt" />
	</appSettings>
	<startup>
		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
	</startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="BouncyCastle.Crypto" publicKeyToken="0e99375e54769942" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.8.9.0" newVersion="1.8.9.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
相关推荐
小吴同学·3 小时前
.NET6 WebApi第1讲:VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】
c#·.netcore·.net core
CodeCraft Studio6 小时前
【实用技能】使用 TX Text Control 创建带有嵌入式附件的 PDF 文档
pdf·asp.net·.net
n***85946 小时前
嵌入式 UI 开发的开源项目推荐
windows·开源·开源软件
小袁搬码7 小时前
Windows中指定路径安装DockerDesktop
windows·docker·容器·docker desktop
bluefox19798 小时前
使用 Oracle.DataAccess.Client 驱动 和 OleDB 调用Oracle 函数的区别
开发语言·c#
小小大侠客9 小时前
IText创建加盖公章的pdf文件并生成压缩文件
java·pdf·itext
鲤籽鲲10 小时前
C# MethodTimer.Fody 使用详解
开发语言·c#·mfc
工业3D_大熊10 小时前
3D可视化引擎HOOPS Luminate场景图详解:形状的创建、销毁与管理
java·c++·3d·docker·c#·制造·数据可视化
yngsqq10 小时前
c#使用高版本8.0步骤
java·前端·c#
DevOpenClub13 小时前
PDF 转 HTML API 数据接口
pdf