【问题标题】:Edit Total Number of Pages in Footer SelectPDF编辑页脚 SelectPDF 中的总页数
【发布时间】:2016-08-20 21:06:59
【问题描述】:

我正在使用 SelectPDF 的 HtmlToPdf() 将 html 页面转换为 pdf。由于 html 内容很大,我将其分成两半并创建 2 个 PDF。

我正在努力编辑页脚中的 total_pages 以显示实际总页数,而不仅仅是当前文档;以及 page_number 以在两个 PDF 的上下文中显示实际页码。

如何评估 {page_number} 和 {total_pages} 以计算正确的值?我发现的所有示例都使用 PdfDocument(),而不是 HtmlToPdf()。

Dim converter As New HtmlToPdf()
Dim text As New PdfTextSection(0, 10, "Page: {page_number} of {total_pages} ")
text.HorizontalAlign = PdfTextHorizontalAlign.Center
converter.Footer.Add(text)

我同时标记了 C# 和 VB,因为 SelectPDF 适用于这两种语言,并且其中任何一种语言的相关示例都对我有用。谢谢

【问题讨论】:

    标签: c# vb.net pdf


    【解决方案1】:

    上面的答案对我不起作用,因为我试图合并具有不同方向的多个 PDF。 bonnoj 的回答确实添加了页码,但它们不正确,我找不到纠正它们的方法。所以我采取了不同的方法——我创建了一个 PDF,然后为每个 HTML 页面添加了一个 pdfPage,然后向该页面添加了一个 PdfHtmlElement。最后,我遍历页面并为每个页面添加一个自定义页脚。这可能不是最有效的方法,但这是我发现在混合纵向和横向页面时将页脚添加到正确位置的唯一方法。希望它可以节省其他人花费数小时玩不同属性的时间。

    var pdfDocument = new PdfDocument(PdfStandard.Full);
    
    foreach (var (html, pdfPageOrientation) in pages)
    {
        var page = pdfDocument.AddPage(PdfCustomPageSize.A4, new PdfMargins(marginLeft, marginRight, marginTop, marginBottom));
        page.Orientation = pdfPageOrientation;
        
        var pdfHtmlElement = new PdfHtmlElement(html, "");    
    
        page.Add(pdfHtmlElement);
    }
    
    
    var pdfFont = pdfDocument.AddFont(PdfStandardFont.Helvetica);
    pdfFont.Size = 12;
    
    foreach (PdfPage page in pdfDocument.Pages)
    {
      var customFooter = pdfDocument.AddTemplate(page.PageSize.Width, 30);
      var pdfFooterTextElement = new PdfTextElement(0, 15,
        pageFooterText,
        pdfFont)
      {
        HorizontalAlign = PdfTextHorizontalAlign.Right,
        VerticalAlign = PdfTextVerticalAlign.Bottom,
      };
    
      customFooter.Add(pdfFooterTextElement);
    
      page.CustomFooter = customFooter;
    }
    
    pdfDocument.Save(stream);
    

    【讨论】:

      【解决方案2】:

      今天我偶然发现了同样的问题,并找到了解决该问题的方法。转换器能够显示页码,因为它是生成的文档,但无法识别多个生成的文件(您无法访问页面属性),因此我连接的所有页面都显示第 1 页,共 1 页。

      首先,我定义一个 PdfDocument(将其视为主文档),然后使用 HtmlToPdf 将 html 转换后的文件附加到该主文档。

      // Create converter
      converter = new HtmlToPdf();    
      PdfTextSection text = new PdfTextSection(0, 10, "Page: {page_number} of {total_pages}  ", new Font("Arial", 8));
      text.HorizontalAlign = PdfTextHorizontalAlign.Right;
      converter.Footer.Add(text);
      
      // Create main document
      pdfDocument = new PdfDocument();
      

      然后我使用这种方法添加页面(来自 html)

      public void AddPage(string htmlPage)
      {
          PdfDocument doc = converter.ConvertHtmlString(htmlPage);
          pdfDocument.Append(doc);
          converter.Footer.TotalPagesOffset += doc.Pages.Count;
          converter.Footer.FirstPageNumber += doc.Pages.Count;
      }
      

      这会导致主文档的页码正确。可以使用相同的技巧将文件和页码拆分为您描述的多个文档。

      编辑:如果您使用 HtmlToPdf 转换器没有看到任何页码,请不要忘记设置以下属性:

      converter.Options.DisplayFooter = true;
      

      【讨论】:

        【解决方案3】:

        您应该使用以下属性:

        • FirstPageNumber - 控制第一页的页码 呈现。
        • TotalPagesOffset - 控制总页数 生成的 pdf 文档中的偏移量。

        更多细节在这里: http://selectpdf.com/html-to-pdf/docs/html/HtmlToPdfHeadersAndFooters.htm

        【讨论】:

        • 我需要知道 pdf 中生成的 {total_pages} 的值,以便了解 TotalPagesOffset 的值并设置 FirstPageNumber。在设置 Footer.FirstPageNumber 选项后会生成 pdf 页面。
        【解决方案4】:

        有一个名为 itextsharp 的开源库可以帮助获取总页数。

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using iTextSharp.text.pdf;
        using iTextSharp.text.xml;
        namespace GetPages_PDF
        {
          class Program
        {
            static void Main(string[] args)
              {
               // Right side of equation is location of YOUR pdf file
                string ppath = "C:\\aworking\\Hawkins.pdf";
                PdfReader pdfReader = new PdfReader(ppath);
                int numberOfPages = pdfReader.NumberOfPages;
                Console.WriteLine(numberOfPages);
                Console.ReadLine();
              }
           }
        }
        

        然后你也可以在页面上标记文本,但你需要将位置添加到它需要去的地方。

        链接:http://crmhunt.com/how-to-modify-pdf-file-using-itextsharp/

        希望这在某种程度上有所帮助。

        【讨论】:

        • 使用通用 PDF 库进行第二遍肯定是解决问题的一种方法。但是 OP 清楚地提到他正在使用 SelectPDF 并正在搜索与该库一起使用的解决方案。
        • iTextSharp 不是这个特定问题的解决方案,因为 1) 我在创建 PDF 时将该信息添加到页脚。 2)我正在寻找不仅更新总页数,而且在2个pdf之间的总页数范围内更新当前页面的正确数量的方法。例如,如果 2 个 pdf 中的每一个都有 5 页,那么第二个文档的第一页应该在页脚中:“Page: 6 of 10”。我试图弄清楚如何添加该页面偏移量或如何直接访问 {page_number} 和 {total_pages} - SelectPDF 定义的值。
        猜你喜欢
        • 2023-01-16
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        • 2018-02-16
        • 2017-12-10
        • 1970-01-01
        相关资源
        最近更新 更多