使用 iTextsharp 将 PDF 拆分为多个 PDF
Posted
技术标签:
【中文标题】使用 iTextsharp 将 PDF 拆分为多个 PDF【英文标题】:Split PDF into multiple PDFs using iTextsharp 【发布时间】:2013-09-16 16:57:24 【问题描述】:public int SplitAndSave(string inputPath, string outputPath)
FileInfo file = new FileInfo(inputPath);
string name = file.Name.Substring(0, file.Name.LastIndexOf("."));
using (PdfReader reader = new PdfReader(inputPath))
for (int pagenumber = 1; pagenumber <= reader.NumberOfPages; pagenumber++)
string filename = pagenumber.ToString() + ".pdf";
Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileStream(outputPath + "\\" + filename, FileMode.Create));
document.Open();
copy.AddPage(copy.GetImportedPage(reader, pagenumber));
document.Close();
return reader.NumberOfPages;
我想将 Pdf 拆分为多个 PDF,间隔为 50 页。(假设如果有 400 页 PDF,我想要 8 个 pdf)。上面的代码将每一页分成一个pdf。请帮助我...我正在使用带有 iTextSharp 的 asp.net。
【问题讨论】:
提示:如果您只想每 50 页创建一个新文档,为什么要在每个循环迭代 期间创建一个新文档? 【参考方案1】:每次前进一页时,您都在循环浏览 pdf 并创建一个新文档。您需要跟踪您的页面,以便仅每 50 页执行一次拆分。就个人而言,我会将其放在一个单独的方法中并从您的循环中调用它。像这样的:
private void ExtractPages(string sourcePDFpath, string outputPDFpath, int startpage, int endpage)
PdfReader reader = null;
Document sourceDocument = null;
PdfCopy pdfCopyProvider = null;
PdfImportedPage importedPage = null;
reader = new PdfReader(sourcePDFpath);
sourceDocument = new Document(reader.GetPageSizeWithRotation(startpage));
pdfCopyProvider = new PdfCopy(sourceDocument, new System.IO.FileStream(outputPDFpath, System.IO.FileMode.Create));
sourceDocument.Open();
for (int i = startpage; i <= endpage; i++)
importedPage = pdfCopyProvider.GetImportedPage(reader, i);
pdfCopyProvider.AddPage(importedPage);
sourceDocument.Close();
reader.Close();
因此,在您的原始代码循环中通过您的 pdf 并且每 50 页调用上述方法。您只需要在块中添加变量来跟踪开始/结束页面。
【讨论】:
【参考方案2】:这将是有用的。非常符合您的要求
http://www.codeproject.com/Articles/559380/SplittingplusandplusMergingplusPdfplusFilesplusinp
【讨论】:
我使用了上面的 codeproject 代码,但出现错误:"Access to the path denied"; 这意味着您无权写入您正在编写 pdf 的文件夹。【参考方案3】:这是一个较短的解决方案。尚未测试哪种方法具有更好的性能。
private void ExtractPages(string sourcePDFpath, string outputPDFpath, int startpage, int endpage)
var pdfReader = new PdfReader(sourcePDFpath);
try
pdfReader.SelectPages($"startpage-endpage");
using (var fs = new FileStream(outputPDFpath, FileMode.Create, FileAccess.Write))
PdfStamper stamper = null;
try
stamper = new PdfStamper(pdfReader, fs);
finally
stamper?.Close();
finally
pdfReader.Close();
【讨论】:
您的解决方案最相关的优势是它保留了文档级数据(元数据、文档级附件...),它更短只是一个很好的副作用。 @mkl 我发现 PDFCopy 在保持 XmpMetadata 和其他所有内容完好无损方面做得更好。PdfCopy
比 PdfStamper
好?这听起来难以置信。只有在PdfCopy
偶然修复了一些问题而PdfStamper
保持问题不变的情况下才有可能。除非我忽略了什么……;)【参考方案4】:
我遇到了同样的问题,但想将 iText7 用于 .NET。 在这个具体案例中,这段代码对我有用:
第一个:实现自己的 PdfSplitter
public class MyPdfSplitter : PdfSplitter
private readonly string _destFolder;
private int _pageNumber;
public MyPdfSplitter(PdfDocument pdfDocument, string destFolder) : base(pdfDocument)
_destFolder = destFolder;
protected override PdfWriter GetNextPdfWriter(PageRange documentPageRange)
_pageNumber++;
return new PdfWriter(Path.Combine(_destFolder, $"p_pageNumber.pdf"));
第二个:用它来分割你的 PDF
using (var pdfDoc = new PdfDocument(new PdfReader(filePath)))
var splitDocuments = new MyPdfSplitter(pdfDoc, targetFolder).SplitByPageCount(1);
foreach (var splitDocument in splitDocuments)
splitDocument.Close();
从 Java 示例迁移的代码:https://itextpdf.com/en/resources/examples/itext-7/splitting-pdf-file
希望这对其他人有所帮助!
【讨论】:
以上是关于使用 iTextsharp 将 PDF 拆分为多个 PDF的主要内容,如果未能解决你的问题,请参考以下文章
在 c#.net 中使用 iTextSharp 合并多个 PDF
如何使用 itextsharp.net 将相同的数字签名放置到 PDF 中的多个位置