为有中文需求的客户提供多渠道中文技术支持.

Sat Oct 08, 2022 3:01 am

您好,

我参考中文帮助中的代码给一个横向的页面设置页眉页脚, 执行后,页脚和页眉分别跑到了左侧和右侧, 代码如下:

Code: Select all

static void Main(string[] args)
{
   //加载一个测试文档
   PdfDocument existingPdf = new PdfDocument();
   existingPdf.LoadFromFile(@"C:\Users\Administrator\Desktop\test加页眉页脚.pdf");

   //调用DrawHeader方法在现有文档添加页眉
   DrawHeader(existingPdf);

   //调用DrawFooter方法在现有文档添加页脚
   DrawFooter(existingPdf);

   //保存文档
   existingPdf.SaveToFile(@"C:\Users\Administrator\Desktop\test加页眉页脚_ok.pdf");
}

//在页面上方空白部位绘制页眉
static void DrawHeader(PdfDocument doc)
{
   //获取页面大小
   SizeF pageSize = doc.Pages[0].Size;

   //声明x,y两个float型变量
   float x = 90;
   float y = 20;

   for (int i = 0; i < doc.Pages.Count; i++)
   {
      //在每一页的指定位置绘制图片
      PdfImage headerImage = PdfImage.FromFile(@"C:\Users\Administrator\Desktop\logo.png");
      float width = headerImage.Width / 3;
      float height = headerImage.Height / 3;
      doc.Pages[i].Canvas.DrawImage(headerImage, x, y, width, height);

      //在每一页的指定位置绘制横线
      PdfPen pen = new PdfPen(PdfBrushes.Gray, 0.5f);
      doc.Pages[i].Canvas.DrawLine(pen, x, y + height + 2, pageSize.Width - x, y + height + 2);
   }
}

//在页面下方空白部位绘制页脚
static void DrawFooter(PdfDocument doc)
{
   //获取页面大小
   SizeF pageSize = doc.Pages[0].Size;

   //声明x,y两个float型变量
   float x = 90;
   float y = pageSize.Height - 72;

   for (int i = 0; i < doc.Pages.Count; i++)
   {
      //在每一页的指定位置绘制横线
      PdfPen pen = new PdfPen(PdfBrushes.Gray, 0.5f);
      doc.Pages[i].Canvas.DrawLine(pen, x, y, pageSize.Width - x, y);

      //在每一页的指定位置绘制文字
      PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("黑体", 10f, FontStyle.Bold), true);

      //在每一页的指定位置当前页码和总页码
      PdfPageNumberField number = new PdfPageNumberField();
      PdfPageCountField count = new PdfPageCountField();
      PdfCompositeField compositeField = new PdfCompositeField(font, PdfBrushes.Black, "第{0}页/共{1}页", number, count);
      compositeField.StringFormat = new PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Top);
      SizeF size = font.MeasureString(compositeField.Text);
      compositeField.Bounds = new RectangleF(pageSize.Width - x - size.Width, y, size.Width, size.Height);
      compositeField.Draw(doc.Pages[i].Canvas);
   }
}


最终期待的效果如下:
a.png

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Sat Oct 08, 2022 8:29 am

Hello,

感谢您的询问。
由于您的文档页面具有旋转角度,像你那样在页面上直接绘制,位置会不正确。可以像下面代码通过创建新页面绘制模板,然后再添加页眉页脚到正确位置。
Code: Select all
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile(@"加页眉页脚.pdf");
            //创建新文档
            PdfDocument newPdf = new PdfDocument();
            PdfPageBase newPage = null;
            //新建页面
            for (int i = 0; i < pdf.Pages.Count; i++)
            {
                PdfPageBase page = pdf.Pages[i];
                if (page.Rotation == PdfPageRotateAngle.RotateAngle90 || page.Rotation == PdfPageRotateAngle.RotateAngle270)
                {
                    newPage = newPdf.Pages.Insert(i, new SizeF(page.Size.Height, page.Size.Width), new PdfMargins(0));
                }
                else
                {
                    newPage = newPdf.Pages.Insert(i, page.Size, new PdfMargins(0));
                }               newPage.Canvas.DrawTemplate(page.CreateTemplate(), new PointF(0, 0));
            }
            DrawHeader(newPdf);
            DrawFooter(newPdf);
            newPdf.SaveToFile(@"output.pdf");       

此外,由于您的PDF文档本身只有一页,所以通过域来获取页码是只有一页,要实现您截图中两页效果,只能直接在页眉绘制两个图片,页脚绘制”第1页/共2页“和”第2页/共2页“的文本内容。

Sincerely,
Simple
E-iceblue support team
User avatar

Simple.Li
 
Posts: 248
Joined: Fri Jul 01, 2022 2:33 am

Sat Oct 08, 2022 10:04 am

Simple.Li wrote:Hello,

感谢您的询问。
由于您的文档页面具有旋转角度,像你那样在页面上直接绘制,位置会不正确。可以像下面代码通过创建新页面绘制模板,然后再添加页眉页脚到正确位置。
Code: Select all
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile(@"加页眉页脚.pdf");
            //创建新文档
            PdfDocument newPdf = new PdfDocument();
            PdfPageBase newPage = null;
            //新建页面
            for (int i = 0; i < pdf.Pages.Count; i++)
            {
                PdfPageBase page = pdf.Pages[i];
                if (page.Rotation == PdfPageRotateAngle.RotateAngle90 || page.Rotation == PdfPageRotateAngle.RotateAngle270)
                {
                    newPage = newPdf.Pages.Insert(i, new SizeF(page.Size.Height, page.Size.Width), new PdfMargins(0));
                }
                else
                {
                    newPage = newPdf.Pages.Insert(i, page.Size, new PdfMargins(0));
                }               newPage.Canvas.DrawTemplate(page.CreateTemplate(), new PointF(0, 0));
            }
            DrawHeader(newPdf);
            DrawFooter(newPdf);
            newPdf.SaveToFile(@"output.pdf");       

此外,由于您的PDF文档本身只有一页,所以通过域来获取页码是只有一页,要实现您截图中两页效果,只能直接在页眉绘制两个图片,页脚绘制”第1页/共2页“和”第2页/共2页“的文本内容。

Sincerely,
Simple
E-iceblue support team


感谢您的回复,

感觉代码中还要进行旋转参数设置,有些麻烦

示例中的页面并没有旋转, 只是在word中将页面设置成了横向, 然后另存的pdf

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Sun Oct 09, 2022 8:19 am

Hello,

感谢您的反馈。
是的,我们注意到了需要设置旋转参数的问题。由于文档页面设置为了横向,所以文档长宽发生了置换,您可以参考下面的代码创建新的页面反转长宽移除旋转参数设置。如果还有其它问题,请随时与我们联系。
Code: Select all
            //加载一个测试文档
            PdfDocument existingPdf = new PdfDocument();
            existingPdf.LoadFromFile(@"加页眉页脚.pdf");
            PdfDocument newPdf = new PdfDocument();
            PdfPageBase pdfPageBase1 = existingPdf.Pages[0];
            PdfPageBase pageBase = newPdf.Pages.Add(new SizeF(pdfPageBase1.Size.Height, pdfPageBase1.Size.Width), new PdfMargins(0));
            pdfPageBase1.CreateTemplate().Draw(pageBase, new PointF(0, 0));
            //调用DrawHeader方法在现有文档添加页眉
            DrawHeader(newPdf);
            //调用DrawFooter方法在现有文档添加页脚
            DrawFooter(newPdf);
            //保存文档
            newPdf.SaveToFile(@"result.pdf");


Sincerely,
Simple
E-iceblue support team
User avatar

Simple.Li
 
Posts: 248
Joined: Fri Jul 01, 2022 2:33 am

Mon Oct 10, 2022 3:14 am

再次感谢

keLi1680
 
Posts: 30
Joined: Sun Oct 02, 2022 2:35 am

Mon Oct 10, 2022 6:08 am

Hello,

感谢您的反馈。
很高兴听到您的问题已经得到解决。如果还有其它问题,请随时与我们联系。

Sincerely,
Simple
E-iceblue support team
User avatar

Simple.Li
 
Posts: 248
Joined: Fri Jul 01, 2022 2:33 am

Return to 中文技术支持