本教程展示了使用LEADTOOLS SDK在c# Windows控制台应用程序中单独保存多页PDF中的每一页的三种不同技术。
| 概述 | |
|---|---|
| 总结 | 本教程介绍如何在c# Windows控制台应用程序中分割多页PDF文件。 |
| 完成时间 | 30分钟 |
| Visual Studio项目 | 下载教程项目(4kb) |
| 平台 | c# Windows控制台应用程序 |
| IDE | Visual Studio 2017, 2019 |
| 开发许可 | 下载LEADTOOLS |
| 用另一种语言试试 |
|
步骤熟悉创建项目的基本步骤添加引用和设置License教程,在工作之前将PDF文件拆分为多个文件-控制台c#教程。
中创建的项目的副本开始添加引用和设置License教程。如果该项目不可用,请按照该教程中的步骤创建它。
所需要的参考资料取决于项目的目的。引用可以通过以下两种方法中的一种添加(但不能同时添加)。
如果使用NuGet引用,本教程需要以下NuGet包:
Leadtools.Document.Sdk如果使用本地DLL引用,则需要以下DLL。
dll位于< INSTALL_DIR > \ LEADTOOLS22 \ Bin \ Dotnet4 \ x64:
Leadtools.dllLeadtools.Codecs.dllLeadtools.Codecs.Cmp.dllLeadtools.Codecs.Tif.dllLeadtools.Document.dllLeadtools.Document.Converter.dllLeadtools.Document.Pdf.dllLeadtools.Document.Writer.dllLeadtools.Pdf.dllLeadtools.Ocr.dllLeadtools.Ocr.LEADEngine.dll有关应用程序需要哪些DLL文件的完整列表,请参阅在你的申请中包含的文件.
许可证解锁项目所需的特性。它必须在调用任何工具箱函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时License.
有两种类型的运行时许可证:
请注意
中详细介绍了添加LEADTOOLS NuGet和本地引用以及设置许可添加引用和设置License教程。
随着项目的创建、引用的添加和许可的设置,编码就可以开始了。
在解决方案资源管理器,打开Program.cs.将以下语句添加到顶部的using块中Program.cs:
//在顶部使用块使用系统;使用先;使用Leadtools;使用Leadtools.Codecs;使用Leadtools.Pdf;使用Leadtools.Document;使用Leadtools.Document.Converter;使用Leadtools.Document.Writer;使用Leadtools.Ocr;
将下面的代码添加到Main ()方法创建拆分文件目录,并调用下面各节中创建的方法。
静态无效主要(字符串[]参数){试一试{SetLicense ();字符串multipageFile =@“C: \ LEADTOOLS22 \资源\ \ leadtools.pdf图像”;字符串_splitDir =@“C: \ LEADTOOLS22 \ Resources \ \分割图像pdf文档”;如果(! Directory.Exists (_splitDir)){Directory.CreateDirectory (_splitDir);}SplitUsingRasterCodecs (multipageFile _splitDir);SplitUsingPDFFile (multipageFile _splitDir);SplitUsingLEADDocument (multipageFile _splitDir);}抓(异常交货){Console.WriteLine (ex.ToString ());}控制台。WriteLine (“按任意键退出。”);控制台。ReadKey (真正的);}
下面将讨论三种不同的分割PDF文件页面的技术,每种技术都有自己的优点。
在这种方法中,每个页面都以栅格(位图)图像的形式加载,然后保存为栅格PDF文件。这是使用RasterCodecs类。
这种方法的主要优点是代码简单。它只需要几行代码,而且完全相同的代码可以用于其他多页格式,如TIFF或GIF。
方法中创建新方法程序类命名SplitUsingRasterCodecs(string inputFile, string _directory).方法中调用此方法Main ()方法,如上所示。
静态无效SplitUsingRasterCodecs (字符串inputFile,字符串_directory){使用(RasterCodecs codecs =新RasterCodecs ()){codecs.Options.Pdf.InitialPath =@ " C: \ LEADTOOLS22 \ Bin \ Dotnet4 \ x64”;inttotalPages = codecs.GetTotalPages(inputFile);控制台。写($“SplitUsingRasterCodecs . .\nTotal pages: {totalPages},分割页面:");为(intPage = 1;page <= totalPages;+ +页){控制台。写($“{页面}. .”);字符串outputFileName = $“{Path.GetFileNameWithoutExtension (inputFile)} _codecs_page{页面}. pdf”;字符串outputFile =路径。结合(_directory outputFileName);使用(RasterImage图像=编解码器。负载(inputFile、页面)编解码器。保存(image, outputFile, RasterImageFormat。RasPdfLzw, 0);}Console.WriteLine ();}}
在这种方法中,PDFFile类,它是PDF格式的专用类。这意味着该代码不能用于其他文档或图像格式。
这种方法的主要优点是它保留了PDF页面的内容,因为它不将可搜索的文本转换为光栅图像。此外,在许多情况下,它不会导致原始PDF文件中的图像重新编码,从而提高性能并保持图像质量。代码也非常简单。
方法中创建新方法程序类命名SplitUsingPDFFile(string inputFile, string _directory).方法中调用此方法Main ()方法,如上所示。
静态无效SplitUsingPDFFile (字符串inputFile,字符串_directory){PDFFile =新PDFFile (inputFile);inttotalPages = pdfFile.GetPageCount();控制台。写($“SplitUsingPDFFile . .\nTotal pages: {totalPages},分割页面:");为(intPage = 1;page <= totalPages;+ +页){控制台。写($“{页面}. .”);字符串outputFileName = $“{Path.GetFileNameWithoutExtension (inputFile)} _pdfFile_page{页面}. pdf”;字符串outputFile =路径。结合(_directory outputFileName);pdfFile。ExtractPages(page, page, outputFile);}Console.WriteLine ();}
这种方法是三种方法中最先进的,它利用了LEADDocument而且DocumentConverter类。
由于这些类适用于不同的格式,所以类似的代码可以用于分离多种类型的文档文件,并输出到不同的文档和光栅格式。例如,在下面的代码中,简单地更改DocumentFormat.Pdf成为DocumentFormat.Docx将文件分割成Microsoft Word输出页面,而不是PDF页面。此外,这些功能强大的类产生优化的输出文件。
方法中创建新方法程序类命名SplitUsingPDFFile(string inputFile, string _directory).方法中调用此方法Main ()方法,如上所示。
静态无效SplitUsingLEADDocument (字符串inputFile,字符串_directory){DocumentWriter =新DocumentWriter ();//可选:使用documentWriter.GetOptions()和documentWriter.SetOptions()修改PDF选项varcreateOptions =新CreateDocumentOptions ();LEADDocument inputDocument = DocumentFactory。LoadFromFile (inputFile新LoadDocumentOptions ());IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(ocrengintype . lead);ocrEngine。启动(零,零,零,@“C: \ LEADTOOLS22 \ Bin \常见\ OcrLEADRuntime”);控制台。写($“SplitUsingLEADDocument . .\nTotal pages: {inputDocument.Pages。Count},分割页面:");foreach(varinputPage在inputDocument.Pages){LEADDocument pageDocument = DocumentFactory.Create(createOptions);pageDocument。AutoDisposeDocuments =真正的;pageDocument。Name =“VirtualPage”;pageDocument.Pages.Add (inputPage);docConverter =新DocumentConverter ();docConverter。SetOcrEngineInstance (ocrEngine假);docConverter.SetDocumentWriterInstance (documentWriter);intpage = inputDocument.Pages.IndexOf(inputPage) + 1;//(+ 1),因为index是从零开始的控制台。写($“{页面}. .”);varjobData =新DocumentConverterJobData{文档= pageDocument,OutputDocumentFileName =路径。结合(_directory, $“{Path.GetFileNameWithoutExtension (inputFile)} _LeadDoc_page{页面}. pdf”),DocumentFormat = DocumentFormat. pdf};varjob = docConverter.Jobs.CreateJob(jobData);docConverter.Jobs.RunJob(工作);}控制台。WriteLine (”“);ocrEngine.Shutdown ();}
来处理文件使用MemoryStream,修改两种方法SplitUsingRasterCodecs而且SplitUsingLEADDocumentreplace类调用它们的代码Main ()方法如下:
//下面的代码在Main方法中//注意PDFFile类不接受流输入字节[] multipageData = File.ReadAllBytes(multipageFile);使用(MemoryStream multipageStream =新MemoryStream (multipageData)){SplitUsingRasterCodecs (multipageStream);SplitUsingLEADDocument (multipageStream);}静态无效SplitUsingRasterCodecs(流inputStream){使用(RasterCodecs codecs =新RasterCodecs ()){codecs.Options.Pdf.InitialPath =@ " C: \ LEADTOOLS22 \ Bin \ Dotnet4 \ x64”;inttotalPages = codecs.GetTotalPages(inputStream);控制台。写($“SplitUsingRasterCodecs . .\nTotal pages: {totalPages},分割页面:");为(intPage = 1;page <= totalPages;+ +页){控制台。写($“{页面}. .”);使用(RasterImage图像=编解码器。负载(inputStream,页面))使用(MemoryStream outputStream =新MemoryStream ()){编解码器。保存(image, outputStream, RasterImageFormat。RasPdfLzw, 0);//使用包含拆分文件的输出内存流,在它被关闭并释放给下一页之前}}Console.WriteLine ();}}静态无效SplitUsingLEADDocument(流inputStream){DocumentWriter =新DocumentWriter ();//可选:使用documentWriter.GetOptions()和documentWriter.SetOptions()修改PDF选项varcreateOptions =新CreateDocumentOptions ();LEADDocument inputDocument = DocumentFactory。LoadFromStream (inputStream,新LoadDocumentOptions ());IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(ocrengintype . lead);ocrEngine。启动(零,零,零,@“C: \ LEADTOOLS22 \ Bin \常见\ OcrLEADRuntime”);控制台。写($“SplitUsingLEADDocument . .\nTotal pages: {inputDocument.Pages。Count},分割页面:");foreach(varinputPage在inputDocument.Pages){LEADDocument pageDocument = DocumentFactory.Create(createOptions);pageDocument。AutoDisposeDocuments =真正的;pageDocument。Name =“VirtualPage”;pageDocument.Pages.Add (inputPage);docConverter =新DocumentConverter ();docConverter。SetOcrEngineInstance (ocrEngine假);docConverter.SetDocumentWriterInstance (documentWriter);intpage = inputDocument.Pages.IndexOf(inputPage) + 1;//(+ 1),因为index是从零开始的控制台。写($“{页面}. .”);varjobData =新DocumentConverterJobData{文档= pageDocument,OutputDocumentStream =新MemoryStream (),DocumentFormat = DocumentFormat. pdf,JobName =“LeadDoc_page”+页面};varjob = docConverter.Jobs.CreateJob(jobData);docConverter.Jobs.JobCompleted += Jobs_JobCompleted;docConverter.Jobs.RunJob(工作);}控制台。WriteLine (”“);ocrEngine.Shutdown ();}私人静态无效Jobs_JobCompleted (对象sender, DocumentConverterJobEventArgs{MemoryStream outputStream = e.Job.JobData.OutputDocumentStream作为MemoryStream;//转换作业完成后,每个输出流将包含一个分割页//在释放和关闭之前使用流outputStream.Dispose ();outputStream.Close ();}
按下运行项目F5,或选择Debug ->开始调试.
如果正确地执行了这些步骤,应用程序将运行并创建新文件。每一页leadtools.pdf应该以三种不同的方式将其创建为单独的PDF文件,并将页码附加在名称后面。
本教程展示了如何添加必要的引用来加载PDF文件的所有页面,并使用各种技术将它们分割为单独的文档。