【问题标题】:Migradoc Header, Paragraph with multiple text alignmentsMigradoc 标题,具有多个文本对齐的段落
【发布时间】:2015-05-02 01:10:08
【问题描述】:

我在 Migradoc 文档中使用页眉。现在我只是在标题中添加了一个段落,但它并不真正符合我的需要,因为我想要说两个具有不同对齐方式的文本。例如:

         Middle-ALigned.Text        Right-Aligned-Text
            second line                 second line

在我使用两个文本框并将它们添加到部分(不是作为标题)之前。这以某种方式起作用,但不是正确的选择,因为我想在每一页上打印文本,这就是标题的用途。 所以问题是我如何在一个段落中以不同的方式对齐两个文本,或者如何让两个段落出现在标题的相同高度上。

希望有人能帮忙。

干杯

【问题讨论】:

    标签: c# migradoc


    【解决方案1】:

    保持简单:使用制表位

    执行此操作的最佳方法与您在大多数文字处理工具中所做的相同:右对齐制表位,放置在页面的右边距,“左”文本居中对齐。这很简单,但我在任何地方都找不到“完整”的解决方案,所以这就是您需要的:

    // 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 来定义当前部分的页面大小:

    // 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 / 2, TabAlignment.Center);
    footerP.Format.TabStops.AddTabStop(tabStopPosition, TabAlignment.Right);
    footerP.Format.Alignment = ParagraphAlignment.Center;
    

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

    结果

    【讨论】:

      【解决方案2】:

      您可以将 TextFrames 添加到标题中 - 然后它们将出现在每个页面上。

      或者使用一个段落作为标题。使用 TabStops 来定位文本(就像在 Word 中一样,有左对齐、居中对齐和右对齐的 TabStops。使用 TabStops 您必须像这样处理换行符:
      (TabStop)中间文本(TabStop)RightText(LineBreak)(TabStop)MT 第二行(TabStop)RT 第二行。

      另请参阅:
      https://stackoverflow.com/a/29250830/1015447

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 2019-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多