编辑页脚SelectPDF中的页面总数

时间:2016-04-26 20:26:07

标签: c# vb.net pdf

我正在使用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适用于两种语言,任何一种语言的相关样本都适合我。谢谢

4 个答案:

答案 0 :(得分:1)

今天我偶然发现了同样的问题,我找到了解决问题的办法。转换器能够显示其生成的文档的页码,但无法识别多个生成的文件(您无法访问页面属性),因此我连接的所有页面都显示页面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;

答案 1 :(得分:0)

有一个名为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();
      }
   }
}

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

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

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

答案 2 :(得分:0)

您应该使用以下属性:

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

此处有更多详情: http://selectpdf.com/html-to-pdf/docs/html/HtmlToPdfHeadersAndFooters.htm

答案 3 :(得分:0)

上面的答案对我不起作用,因为我试图合并多个具有不同方向的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);