【问题标题】:itextsharp add 1 page template to all pagesitextsharp 向所有页面添加 1 个页面模板
【发布时间】:2013-05-30 19:48:36
【问题描述】:

我正在 ASP.Net 应用程序中动态创建 PDF 文件。 数据可以从 1 页到超过 10 页不等。 我正在使用 PdpfTables 和 Cells 来对齐运行良好的数据。 IT 正在创建页面,因为它需要新页面。唯一的问题是我无法将我的模板添加到所有页面,只有第一页。

我的模板是一个 1 页的 PDF 文件。要将其添加到我使用以下代码的第一页

PdfContentByte cb = writer.DirectContent;
cb.AddTemplate(page, 0, 0);

正如我所说,这适用于第一页,但不适用于之后的任何页面。 所以我尝试在关闭所有流之前添加以下代码,但它什么也没做

for (var i = 2; i <= writer.CurrentPageNumber; i++)
{
    var y = (writer.PageSize.Height * (i - 1));
    cb.AddTemplate(page, 0, y);
}

我并没有在网上找到与我的问题完全相关的任何内容,但是那些类似的问题并没有帮助。

任何建议都会很棒,谢谢。

【问题讨论】:

  • 当您在位置 (0, y) 添加模板且 y 大于页面高度时,您将模板添加到页面可见区域之外。我不明白为什么你会认为这会奏效,它真的让想要帮助你的人感到困惑。您应该接受 mkl 的回答。 100% 正确。
  • 因为 Y 是页面的高度,所以我的理论是它将从下一页开始。我现在正在尝试他的答案。它可能对你有用,但这并不意味着它适用于我的情况!
  • 页面是独立的实体。它是 PDF,不是 HTML。

标签: asp.net asp.net-mvc-4 pdf-generation itextsharp


【解决方案1】:

如果您希望在每个页面上发生某些事情,您应该使用页面事件并在OnEndPage 调用的情况下采取行动。 Webified iTextSharp Example Stationery.cs 展示了如何做到这一点。它本质上是对PdfWriter 进行后初始化,以使用内部帮助类作为页面事件侦听器并检索背景:

PdfWriter writer = PdfWriter.GetInstance(document, ms);
[...]
writer.PageEvent = new TemplateHelper(this);
PdfReader reader = new PdfReader(stationary);
page = writer.GetImportedPage(reader, 1);

page 是成员变量:

private PdfImportedPage page;

它被TemplateHelper 内部助手类使用:

class TemplateHelper : PdfPageEventHelper {
  private Stationery instance;
  public TemplateHelper() { }
  public TemplateHelper(Stationery instance) { 
    this.instance = instance;
  }
  /**
   * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(
   *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
   */
  public override void OnEndPage(PdfWriter writer, Document document) {
    writer.DirectContentUnder.AddTemplate(instance.page, 0, 0);
  }
}

【讨论】:

  • 完美。谢谢你。睡了一晚才搞定它,但它现在正在工作。我只需要在第一个之后修复页面的上边距。应该不难。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多