当前位置: 首页 > 知识库问答 >
问题:

在itext7-PDF文档中。GetNumberOfPages()始终只返回一页

杭曦
2023-03-14
  • 我试图在html页面的页脚部分实现Y的第X页。
  • 我通过调用GetPageNumber(PdfPage)来检索X,通过调用GetNumberOfPages()来检索Y。
  • 在iText. Kernel. Pdf中引用了PdfDocumi。但是每次我调用GetNumberOfPages()时,它每次只返回一个页面。
  • 例如:当我的总页面为4时,我得到的页脚值如下所示。
  • 第一页-

共有1个答案

易元青
2023-03-14

答案评论中的链接不再有效,但我认为这是更新的链接。我用这些信息和一些小的调整让它工作。

我是这样做的。添加这样的事件处理程序:

pdfDocument.AddEventHandler(PdfDocumentEvent.END_PAGE, pageNumberHandler);

下面是我在C#中的事件处理程序代码:

using iText.Kernel.Events;
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas;
using iText.Kernel.Pdf.Xobject;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;
using NLog;

namespace PrintLibrary.iTextEvent
{
    public class PageNumberHandler : IEventHandler
    {
        private ILogger Logger => _logger ?? (_logger = LogManager.GetCurrentClassLogger());
        private readonly PdfFormXObject _totalPagesPlaceHolder = new PdfFormXObject(new Rectangle(0, 0,40,20)); 
        public void HandleEvent(Event e)
        {
            var docEvent = (PdfDocumentEvent)e;
            var pdf = docEvent.GetDocument();
            var pageCount = pdf.GetNumberOfPages();
            if (pageCount <= 1)
            {
                // return here because I don't want page 1 of 1 printing, but only when it's more than 1 page
                Logger.Trace("Only 1 page in document, returning");
                return;
            }
            Logger.Trace($"Run {nameof(HandleEvent)}");
            
            var page = docEvent.GetPage();
            var currentPageNumber = pdf.GetPageNumber(page);
            
            var pageSize = page.GetPageSize();
            var pdfCanvas = new PdfCanvas(page);
            var canvas = new Canvas(pdfCanvas, pageSize);

            var p = new Paragraph()
                .Add($"Page {currentPageNumber}");

            Logger.Trace($"Printing text to page, current page # {currentPageNumber}");
            
            var x = pageSize.GetWidth() / 2;
            var y = pageSize.GetBottom() + 20; 
            canvas.ShowTextAligned(p,
                x, y, TextAlignment.RIGHT);
            canvas.Close();
            
            pdfCanvas.AddXObjectAt(_totalPagesPlaceHolder, x, y);
            pdfCanvas.Release();
        }

        public void WriteTotal(PdfDocument pdf)
        {
            var pages = pdf.GetNumberOfPages();
            if (pages <= 1) return;
            
            Logger.Trace($"Setting total number of pages on footer to {pages}");
            var canvas = new Canvas(_totalPagesPlaceHolder, pdf);
            canvas.ShowTextAligned($"of {pages}", 3f, 0, TextAlignment.LEFT);
            canvas.Close();
        }

        private ILogger _logger;
    }
}
 类似资料:
  • 我有一本书的多份副本。不同用户评论的pdf文档。我想把所有这些评论合并成一个新的pdf“合并”。 我在一个名为“路径”和“目录”属性的文档类中编写了这个子类。 这段代码导致了一个我无法解决的异常。 iText。内核PDFEException:“Pdf间接对象属于其他Pdf文档。将对象复制到当前pdf文档。' 要执行此任务,我需要更改什么?还是我完全摆脱了我的代码块?

  • 环境 期望的行为 我想更新文档并返回原始文档。 实际行为 正在返回更新的文档,而不是原始文档。 我试过的 起初,我在查看findAndModify: http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#findAndModify 然而,那里的文档表示它已被弃用,并使用findOneAndUpdate、findOn

  • 问题内容: 我正在搜索索引中的文档,然后尝试通过获取其中的一些文档。尽管收到了一组结果,但是某些文档无法通过简单的get来检索。更糟糕的是,我可以通过URI搜索获得相同的文档,其中 例如,运行一个简单的GET 给我结果: 但是,如果我使用相同的_id进行搜索: 我得到了预期的结果: 我正在通过Stretcher ruby​​ API索引文档,索引后立即进行刷新。我的本地设置是 2个节点 。我正在运

  • 问题内容: 如果将来我使用setMaxAge()设置cookie,那么当我在后续请求中将cookie读回内存时,getMaxAge()会返回-1。我已经通过Chrome的设置和检查器检查了实际的cookie,并且可以验证该过期日期确实设置为将来的60天。 为什么c.getMaxAge()总是返回-1? 问题答案: 浏览器不会发送cookie属性,例如路径和过期。它仅将名称和值发送回去。如果最大期限

  • 问题内容: 我以前使用过媒体播放器,但从未遇到过此问题。每当我尝试使用MediaPlayer.create()时,该方法都会使我为null,并且无法播放声音。有什么我想念的吗? 我的sound.mp3在我的原始文件夹中,通过将声音拖到eclipse中的文件夹中,我将其放置在其中。请帮忙,因为我以前玩过声音,所以这真的困扰我:( 问题答案: 如果create() API由于某种原因失败,则返回nul

  • 问题内容: 尽管是有效的类,但以下代码会打印。 文档说方法返回 由 aClassName 命名的类对象,或者如果当前没有加载该名称的类。如果 aClassName 为,则返回。 我也试图获得当前的viewcontroller已加载但仍然得到 可能是什么问题? 更新: 即使尝试这样做,我仍然可以 问题答案: 该函数 确实 适用于(纯和Objective-C派生的)swift类,但是仅当您使用全限定名