【问题标题】:C# How to write page number when split large pdf file into small multiple pdf fileC#如何在将大型pdf文件拆分为多个小型pdf文件时写入页码
【发布时间】:2018-08-14 05:47:32
【问题描述】:

我有许多包含许多页面的大型 pdf 文件。我必须将那些大的 pdf 拆分成多个小的 pdf 文件。

我有一个代码,可用于将大 pdf 拆分为多个小的 pdf 文件。 下面的代码,我用于拆分。

private void SplitAndSaveInterval(string pdfFilePath, string outputPath, int startPage, int interval, string pdfFileName)  
{
    using (PdfReader reader = new PdfReader(pdfFilePath))  
    {  
        Document document = new Document();  
        PdfCopy copy = new PdfCopy(document, new FileStream(outputPath + "\\" + pdfFileName + ".pdf", FileMode.Create));  
        document.Open();  

        for (int pagenumber = startPage; pagenumber < (startPage + interval); pagenumber++)  
        {  
            if (reader.NumberOfPages >= pagenumber)  
            {  
                copy.AddPage(copy.GetImportedPage(reader, pagenumber));  
            }  
            else  
            {  
                break;  
            }  
        }  

        document.Close();  
    }  
} 

此代码取自https://www.c-sharpcorner.com/article/splitting-pdf-file-in-c-sharp-using-itextsharp/

我有一个添加页码的例程。附例程:

void AddPageNumber(string fileIn, string fileOut)
{
    byte[] bytes = File.ReadAllBytes(fileIn);
    Font blackFont = FontFactory.GetFont("Arial", 12, Font.NORMAL, BaseColor.BLACK);
    using (MemoryStream stream = new MemoryStream())
    {
        PdfReader reader = new PdfReader(bytes);
        using (PdfStamper stamper = new PdfStamper(reader, stream))
        {
            int pages = reader.NumberOfPages;
            for (int i = 1; i <= pages; i++)
            {
                ColumnText.ShowTextAligned(stamper.GetUnderContent(i), Element.ALIGN_RIGHT, new Phrase(i.ToString(), blackFont), 568f, 15f, 0);
            }
        }
        bytes = stream.ToArray();
    }
    File.WriteAllBytes(fileOut, bytes);
}

现在我的问题是如何从 SplitAndSaveInterval() 例程中合并或调用 AddPageNumber() 例程,以最终在新生成的 pdf 文件右上角的每个页面上添加页码。

寻求帮助和建议。谢谢

【问题讨论】:

  • 您使用的是不再支持的旧版 iText。如果您升级到iText 7,您会注意到与 iText 5 相比,使用 iText 7 实现的目标要容易得多。
  • 您所指的页面是我2009年写的那本书的非法副本。那是9年前的事了。请升级到 iText 7 或解释为什么不适合您。

标签: c# pdf itext


【解决方案1】:

看起来您使用的是 iTextSharp,您是否尝试过他们的文档中的以下内容:

public void onEndPage(PdfWriter writer, Document document) {
Rectangle rect = writer.getBoxSize("art");
switch(writer.getPageNumber() % 2) {
case 0:
    ColumnText.showTextAligned(writer.getDirectContent(),
        Element.ALIGN_RIGHT, header[0],
        rect.getRight(), rect.getTop(), 0);
    break;
case 1:
    ColumnText.showTextAligned(writer.getDirectContent(),
        Element.ALIGN_LEFT, header[1],
        rect.getLeft(), rect.getTop(), 0);
    break;
}
ColumnText.showTextAligned(writer.getDirectContent(),
    Element.ALIGN_CENTER, new Phrase(String.format("page %d", pagenumber)),
    (rect.getLeft() + rect.getRight()) / 2, rect.getBottom() - 18, 0);
}

https://developers.itextpdf.com/question/how-add-text-left-and-right-header

【讨论】:

  • 该操作使用 itext 的 PdfCopy 类从现有 pdf 创建 pdf。页面事件用于普通的PdfWriter 从头开始​​创建 pdf。
  • 我正在使用 itextsharp 库。现在告诉我如何在使用 PdfCopy 类时附加 onEndPage 事件?当pdf副本将添加每一页时,我需要在每一页上添加页码....怎么可能?
  • 正如@mkl 解释的那样,您不能将页面事件与PdfCopy 结合使用。请升级到 iText 7 或解释为什么不适合您。
  • @BrunoLowagie itextsharp 用于大型项目。如果我升级,那么我可能需要测试大量代码以确保一切正常。我依赖我的经理。他可能不允许升级。我可以在新项目中使用 itext7 而不是在现有项目中吗?
  • 请询问您的经理该项目是否符合 AGPL 许可证。如果是,请与 iText Software 分享更多信息。
猜你喜欢
  • 2021-12-16
  • 2022-12-19
  • 2010-10-04
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2014-06-06
相关资源
最近更新 更多