2012-11-23 25 views
2

这是一个使用itextsharp库的vb.net应用程序。我正在运行的是下面的代码变得非常多余,在我看来,这不是一个干净的方式去做事情。但我似乎无法弄清楚如何将它分离到一个单独的函数中,在这个函数中,我只需传入字符串x_Cord,y_Cord,并将其倾斜并将其传递给它)a)传入时将其作为数组传入;或者b)为需要它的每一行执行它......然后该函数将返回contentBytes的必要信息......下面的内容非常类似于结束时冗余冗余。从pdf生成器函数中分离冗余代码

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() 

任何想法使它成为它自己的功能?

回答

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语法。这更困难,因此更容易出错。你已经发现了,否则你不会问这个问题;-)

这是一个很好的问题;我会赶上它。