C#快速实现word转pdf与jpg转pdf功能

由于最近各方面都比较忙,博客也没什么时间来更新,今天忙中偷闲来写一篇文章给博客拔拔草,也是记录一下这两天刚遇到并解决得问题。之前生成PDF一般都是用福昕阅读器,但是基本是单线程的转换效率,少的话还行,但是多的话就很难受了。正好今天需要转换几十个word文档成PDF,而且福昕阅读器好像有点问题,一直提示word文件受损,找了一圈也没解决问题,索性就自己写了一个小工具,节省一下时间。

本次需求:选择指定文件夹,将文件夹内所有word或者jpg转换为PDF,遍历文件夹内的所有文件,之前有写过一篇博客,可以移步查看《C#遍历文件夹取所有文件物理路径

实例代码:( Word转Pdf需要电脑安装有office,Jpg转Pdf需要nuget里搜索并引用iTextSharp)

using iTextSharp.text.pdf;
using Microsoft.Office.Interop.Word;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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

            List<string> vs= FindFile(@"C:\Users\gyh\Desktop\文件目录");

            vs = vs.Where(t => t.Contains(".jpg")&&!t.Contains("$")).ToList();

            foreach (var item in vs)
            {
                ConvertJPG2PDFMain(item, item.Replace("jpg", "pdf"));
            }

            vs = vs.Where(t => t.Contains(".pdf") && !t.Contains("$")).ToList();

            foreach (var item in vs)
            {
                WordToPDF(item, item.Replace("docx", "pdf"));
            }

            Console.WriteLine("OK");
        }

        /// <summary>
        /// 遍历文件夹内所有内容
        /// </summary>
        /// <param name="sSourcePath"></param>
        /// <returns></returns>
        public static List<string> FindFile(string sSourcePath)
        {
            List<string> list = new List<string>();

            DirectoryInfo theFolder = new DirectoryInfo(sSourcePath);

            FileInfo[] thefileInfo = theFolder.GetFiles("*.*", SearchOption.TopDirectoryOnly);

            foreach (FileInfo NextFile in thefileInfo)
            {
                list.Add(NextFile.FullName);
            }  //遍历文件

            //遍历子文件夹
            DirectoryInfo[] dirInfo = theFolder.GetDirectories();
            foreach (DirectoryInfo NextFolder in dirInfo)
            {
                FileInfo[] fileInfo = NextFolder.GetFiles("*.*", SearchOption.AllDirectories);
                foreach (FileInfo NextFile in fileInfo)  //遍历文件
                {
                    list.Add(NextFile.FullName);
                }
            }
            return list;
        }

        /// <summary>
        /// word转PDF(使用office内置接口)
        /// </summary>
        /// <param name="sourcePath"></param>
        /// <param name="targetPath"></param>
        /// <returns></returns>
        public static bool WordToPDF(string sourcePath, string targetPath)
        {
            bool result = false;
            Microsoft.Office.Interop.Word.Application application = new Microsoft.Office.Interop.Word.Application();
            Document document = null;
            try
            {
                application.Visible = false;

                document = application.Documents.Open(sourcePath);

                document.ExportAsFixedFormat(targetPath, WdExportFormat.wdExportFormatPDF);

                result = true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                result = false;
            }
            finally
            {
                document.Close();
            }
            return result;
        }

        /// <summary>
        /// jpg转pdf(需要引用iTextSharp)
        /// </summary>
        /// <param name="jpgfile"></param>
        /// <param name="pdf"></param>
        public static void ConvertJPG2PDFMain(string jpgfile, string pdf)
        {
            var document = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 25, 25, 25, 25);
            using (var stream = new FileStream(pdf, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                PdfWriter.GetInstance(document, stream);
                document.Open();
                using (var imageStream = new FileStream(jpgfile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    var image = iTextSharp.text.Image.GetInstance(imageStream);
                    if (image.Height > iTextSharp.text.PageSize.A4.Height - 25)
                    {
                        image.ScaleToFit(iTextSharp.text.PageSize.A4.Width - 25, iTextSharp.text.PageSize.A4.Height - 25);
                    }
                    else if (image.Width > iTextSharp.text.PageSize.A4.Width - 25)
                    {
                        image.ScaleToFit(iTextSharp.text.PageSize.A4.Width - 25, iTextSharp.text.PageSize.A4.Height - 25);
                    }
                    image.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;
                    document.Add(image);
                }

                document.Close();
            }
        }
    }
}

 

以上代码直接创建个控制台程序就能跑,是不是很简单就实现了我们想要的功能。一个小插曲,我在做这个功能之前搜索了网上的很多word转pdf的在线工具,要么转不了,要么得收费,后面如果有时间了,考虑做个工具站吧,顺便把ChatGPT也安排一下。

 

THE END