从pdf生成器函数中分离冗余代码

时间:2012-11-23 04:26:35

标签: vb.net itextsharp

这是一个使用itextsharp库的vb.net应用程序。我正在运行的是以下代码变得非常多余,在我看来,这不是一个干净的做事方式。但我似乎无法弄清楚如何将它分成一个单独的函数,我将简单地传递给字符串,x_Cord,y_Cord,倾斜并让它a)当传入它时,它作为一个数组进入或者b)为需要它的每一行做它...然后函数将返回contentBytes的必要信息......下面与我最终的冗余非常类似。

Dim cb As PdfContentByte = writer.DirectContent

为了清楚起见,我在上面简单地说明了cb的声明。

cb.BeginText()
cb.SetFontAndSize(Californian, 36)
cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "CERTIFICATE OF COMPLETION", 396, 397.91, 0)
cb.SetFontAndSize(Bold_Times, 22)
cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, name, 396, 322.35, 0)
cb.SetFontAndSize(Bold_Times, 16)
cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, _hours + " Hours", 297.05, 285.44, 0)
cb.SetFontAndSize(Bold_Times, 16)
cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, _dates, 494.95, 285.44, 0)
cb.SetFontAndSize(Bold_Times, 16)
cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, _class1, 396, 250.34, 0)
If Not String.IsNullOrWhiteSpace(_class2) Then
    cb.SetFontAndSize(Bold_Times, 16)
    cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, _class2, 396, 235.34, 0)
End If
cb.SetFontAndSize(Copper, 16)
cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, _conf_num + _prefix + " Annual Conference " + _dates, 396, 193.89, 0)
cb.SetFontAndSize(Bold_Times, 13)
cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "Some Name", 396, 175.69, 0)
cb.SetFontAndSize(Bold_Times, 10)
cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "Some Company Manager", 396, 162.64, 0)
cb.EndText()

任何关于使其成为自己的功能的想法?

1 个答案:

答案 0 :(得分:2)

你正在“艰难地”添加内容。如果我是你,我会写一个单独的类/工厂/方法,用内容创建PhraseParagraph。例如:

protected Font f1 = new Font(Californian, 36);
protected Font f2 = new Font(Bold_times, 16);

public Phrase getCustomPhrase(String name, int hours, ...) {
  Phrase p = new Phrase();
  p.add(new Chunk("...", f1));
  p.add(new Chunk(name, f2);
  ...
  return p;
}

然后我会使用ColumnText将PhraseParagraph添加到正确的位置。如果是Phrase,我会使用ColumnText.showTextAligned()方法。在Paragraph的情况下,我会使用这种结构:

ColumnText ct = new ColumnText(writer.DirectContent);
ct.setSimpleColumn(rectangle);
ct.addElement(getCustomParagraph(name, hours, ...));
ct.go();

前者(使用Phrase)是最好的,如果你只需要写一行不需要被包裹,朝向你想要的任何方向。

后者(在复合模式中使用Paragraph)最好是在特定矩形内添加文本(由左下角和上角的坐标定义) - 直角)。

您采用的方法有效,但......它涉及几乎“手动”编写PDF语法。这更难,因此更容易出错。你已经发现了,否则你不会问这个问题; - )

这是一个很好的问题;我会赞成它。