本教程展示了使用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.dll
Leadtools.Codecs.dll
Leadtools.Codecs.Cmp.dll
Leadtools.Codecs.Tif.dll
Leadtools.Document.dll
Leadtools.Document.Converter.dll
Leadtools.Document.Pdf.dll
Leadtools.Document.Writer.dll
Leadtools.Pdf.dll
Leadtools.Ocr.dll
Leadtools.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文件的所有页面,并使用各种技术将它们分割为单独的文档。