我知道如何显示页码以及如何在页脚中对齐它们。但是我的问题是我的页脚包含一些自定义文本,这些文本应左对齐,页码应右对齐。

 string footer = "My custom footer";
 Paragraph footerParagraph = section.Footers.Primary.AddParagraph(footer);
 footerParagraph.AddTab();
 footerParagraph.AddPageField();


上面将为页面1生成“我的自定义页脚1”,我需要页面nmuber位于页面的最右端。我可以添加额外的空格或制表符,但认为必须有一种干净的方法来实现此目的。谢谢。

最佳答案

保持简单:使用制表位

最好的方法与大多数文字处理工具相同:将右对齐的制表位放在页面的右边缘。这很简单,但是我在任何地方都找不到“完整”的解决方案,因此这是您需要的:

// Grab the current section, and other settings
var section = documentWrapper.CurrentSection;
var footer = section.Footers.Primary;
var reportMeta = documentWrapper.AdminReport.ReportMeta;

// Format, then add the report date to the footer
var footerDate = string.Format("{0:MM/dd/yyyy}", reportMeta.ReportDate);
var footerP = footer.AddParagraph(footerDate);

// Add "Page X of Y" on the next tab stop.
footerP.AddTab();
footerP.AddText("Page ");
footerP.AddPageField();
footerP.AddText(" of ");
footerP.AddNumPagesField();

// The tab stop will need to be on the right edge of the page, just inside the margin
//  We need to figure out where that is
var tabStopPosition =
    documentWrapper.CurrentPageWidth
    - section.PageSetup.LeftMargin
    - section.PageSetup.RightMargin;

// Clear all existing tab stops, and add our calculated tab stop, on the right
footerP.Format.TabStops.ClearAll();
footerP.Format.TabStops.AddTabStop(tabStopPosition, TabAlignment.Right);


最难的部分是弄清楚制表符停止位置应该是什么。因为我很无聊并且非常喜欢封装,所以我根据页面宽度减去水平页面边距来动态计算制表符停止位置。但是,获取当前页面宽度并不像我想象的那么容易,因为我正在使用PageFormat设置页面尺寸。

下一个挑战:动态获取页面宽度

首先,我真的很讨厌拥有紧密耦合的代码(想想:扇入和扇出),所以即使我此时知道页面宽度是多少,即使是硬编码,我仍然想要在一个地方硬编码它,然后在其他地方引用那个地方。

我保留了一个自定义的“ has-a” /包装类,以将这些内容封装到其中。这是我的代码中的documentWrapper。此外,我没有将任何PDFSharp / MigraDoc类型公开给我的应用程序的其余部分,因此我使用ReportMeta作为通信设置的方法。

现在获取一些代码。设置该部分时,我使用MigraDoc PageFormat定义当前部分的页面大小:

// Create, and set the new section
var section = documentWrapper.CurrentDocument.AddSection();
documentWrapper.CurrentSection = section;

// Some basic setup
section.PageSetup.PageFormat = PageFormat.Letter; // Here's my little bit of hard-coding
Unit pageWidth, pageHeight;
PageSetup.GetPageSize(PageFormat.Letter, out pageWidth, out pageHeight);

var reportMeta = documentWrapper.AdminReport.ReportMeta;
if (reportMeta.PageOrientation == AdminReportMeta.ORIENT_LANDSCAPE)
{
    section.PageSetup.Orientation = Orientation.Landscape;
    documentWrapper.CurrentPageWidth = pageHeight;
}
else
{
    section.PageSetup.Orientation = Orientation.Portrait;
    documentWrapper.CurrentPageWidth = pageWidth;
}


在这里真正重要的是,我要存储CurrentPageWidth,这在设置我们的制表位时非常重要。 CurrentPageWidth属性只是MigraDoc Unit类型。我可以通过将MigraDoc的PageSetup.GetPageSize与我选择的PageFormat一起使用来确定这是什么。

关于c# - 在MigraDoc中将页码对齐到右上角,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29246146/

10-11 00:06