2

这是一个使用 itextsharp 库的 vb.net 应用程序。我遇到的是以下代码变得非常多余,在我看来这不是一种干净的做事方式。但我似乎无法弄清楚如何将它分离到一个单独的函数中,在该函数中我只需传入字符串 x_Cord、y_Cord、tilt 并让它要么 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()

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

4

1 回答 1

2

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

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 在正确的位置添加Phraseor Paragraph。在 a 的情况下Phrase,我会使用该ColumnText.showTextAligned()方法。在 的情况下Paragraph,我会使用这种结构:

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

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

如果要在特定矩形(由左下角和右上角的坐标定义)内添加文本,则后者(Paragraph复合模式下使用 a )是最好的。

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

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

于 2012-11-23T07:59:44.043 回答