[英]Add PdfPCell to Paragraph
I'm trying to add a TextField (acrofield) in the middle of a Paragraph sentence using iTextSharp. 我正在尝试使用iTextSharp在段落句子的中间添加TextField(acrofield)。 An example would be "The Effective Date is [Day] day of [Month], [Year] that this will begin."
一个例子是“生效日期是[月]的[日]日,[年]这将开始。”
Things I have tried: 我尝试过的事情:
Paragraph para1 = new Paragraph();
para1.Add(New Phrase("The Effective Date is",fontBold));
//The next line is where it breaks, "Insertion of illegal Element: 30"
para1.Add(CreateTextField("Day",1,0)); //this function returns a PdfPCell.
PdfPCell tempCell = new PdfPCell();
tempCell.AddElement(new Phrase("The Effective Date is",fontBold));
//the next line breaks as well, "Element not allowed."
tempCell.AddElement(CreateTextField("Day",1,0));
Paragraph para1 = new Paragraph();
para1.Add(New Phrase("The Effective Date is",fontBold));
para1.AddSpecial(CreateTextField("Day",1,0));
//This doesn't generate an error, but the TextField is not displayed on PDF
Paragraph para1 = new Paragraph();
PdfPTable tempTable = new PdfPTable(1);
para1.Add(New Phrase("Hello",fontBold));
tempTable.AddCell(CreateTextField("Day",1,0));
para1.Add(tempTable);
para1.Add(New Phrase("World",fontBold));
//This doesn't generate an error, but the TextField is not displayed on PDF
I know the CreateTextField(...) works because I am using it in several other places on the page. 我知道CreateTextField(...)有效,因为我在页面上的其他几个地方使用它。
How can I add a TextField inline with other text without using tables and tediously trying to manipulate cell size to accommodate what I need? 如何在不使用表格的情况下添加TextField与其他文本内联,并且繁琐地尝试操作单元格大小以适应我需要的内容?
Thanks for the help! 谢谢您的帮助!
Your question is wrong. 你的问题是错的。 You don't want to add a
PdfPCell
to a Paragraph
. 您不希望将
PdfPCell
添加到Paragraph
。 You want to create inline form fields. 您想要创建内联表单字段。 That's a totally different question.
这是一个完全不同的问题。
Take a look at the GenericFields example. 看一下GenericFields示例。 In this example, we create the
Paragraph
you need like this: 在这个例子中,我们创建你需要的
Paragraph
,如下所示:
Paragraph p = new Paragraph();
p.add("The Effective Date is ");
Chunk day = new Chunk(" ");
day.setGenericTag("day");
p.add(day);
p.add(" day of ");
Chunk month = new Chunk(" ");
month.setGenericTag("month");
p.add(month);
p.add(", ");
Chunk year = new Chunk(" ");
year.setGenericTag("year");
p.add(year);
p.add(" that this will begin.");
Do you see how we add empty Chunk
s where you want to add a PdfPCell
? 你看到我们如何在你想要添加
PdfPCell
的地方添加空Chunk
吗? We use the setGenericTag()
method on these Chunk
object to add a form field where ever the Chunk
s are rendered. 我们在这些
Chunk
对象上使用setGenericTag()
方法来添加一个表单字段,在该字段中呈现Chunk
。
For this to work, we need to declare a page event: 为此,我们需要声明一个页面事件:
writer.setPageEvent(new FieldChunk());
The FieldChunk
class looks like this: FieldChunk
类如下所示:
public class FieldChunk extends PdfPageEventHelper {
@Override
public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
TextField field = new TextField(writer, rect, text);
try {
writer.addAnnotation(field.getTextField());
} catch (IOException ex) {
throw new ExceptionConverter(ex);
} catch (DocumentException ex) {
throw new ExceptionConverter(ex);
}
}
}
Every time a "generic chunk" is rendered, the onGenericTag()
method will be called passing the parameter we used in the setGenericTag()
method as the text
parameter. 每次渲染“通用块”时,都会调用
onGenericTag()
方法,将setGenericTag()
方法中使用的参数作为text
参数传递。 We use the writer
, rect
and text
parameters to create and add a TextField
. 我们使用
writer
, rect
和text
参数来创建和添加TextField
。 The result looks like this: 结果如下:
Feel free to adapt rect
if you want to create a bigger text field. 如果要创建更大的文本字段,请随意调整
rect
。
Important: my example is written in Java. 重要提示:我的示例是用Java编写的。 If you want to port the example to C#, just change the first letter of each method to upper case (eg change
add()
into Add()
). 如果要将示例移植到C#,只需将每个方法的第一个字母更改为大写(例如,将
add()
更改为Add()
)。 If that doesn't work, try setting the parameter as a member variable (eg change writer.setPageEvent(event)
into writer.PageEvent = event
). 如果这不起作用,请尝试将参数设置为成员变量(例如,将
writer.setPageEvent(event)
更改为writer.PageEvent = event
)。
Update: If you want to make the field bigger, you should create a new Rectangle
. 更新:如果要使字段更大,则应创建一个新的
Rectangle
。 For instance: 例如:
Rectangle rect2 = new Rectangle(rect.Left, rect.Bottom - 5, rect.Right, rect.Top + 2);
TextField field = new TextField(writer, rect2, text);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.