我正在与iTextSharp(5.4.5)合作几周。 本周,我遇到了一些奇怪的事情,它涉及到文档中元素的顺序。
我正在撰写包含主题和图片(图表)的pdf报告。
文档的格式如下:
NR。主题标题1
主题1的CHART IMAGE(来自bytearray)
NR。主题2主题标题
主题2的图表图片......
下面的代码示例。我知道代码不完全正确,但它只是指出问题。 让我们假设循环运行10次,所以我希望10个主题标题都直接跟随图像。
我注意到,如果到达页面结束并且应添加新的图像,则图像将移动到下一页,下一个主题标题将打印在上一页上。
所以在纸面上我们有:
第1页:
主题1 image topic 1
主题2 图像主题2
主题3 话题4
第2页:
图片主题3 图像主题4
主题5 图像主题5
...
因此,纸上元素的顺序与我用于通过Document.add方法将元素放入文档的顺序不同。
这真的很奇怪。任何人都有任何想法?
int currentQuestionNr = 0;
foreach (Topic currentTOPIC in Topics)
{
currentQuestionNr++;
//compose question (via table so all questions (with nr prefix) are aligned the same)
PdfPTable questionTable = new PdfPTable(2);
questionTable.WidthPercentage = 100;
questionTable.SetWidths(new int[] { 4, 96 });
PdfPCell QuestionNrCell = new PdfPCell();
QuestionNrCell.BorderWidth = 0;
QuestionNrCell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
QuestionNrCell.VerticalAlignment = PdfPCell.ALIGN_TOP;
QuestionNrCell.AddElement(new Paragraph(String.Format("{0}. ", currentQuestionNr), PdfUtility.font_10_bold));
PdfPCell QuestionPhraseCell = new PdfPCell();
QuestionPhraseCell.BorderWidth = 0;
QuestionPhraseCell.HorizontalAlignment = PdfPCell.ALIGN_LEFT;
QuestionPhraseCell.VerticalAlignment = PdfPCell.ALIGN_TOP;
QuestionPhraseCell.AddElement(new Paragraph(currentTOPIC.Title, PdfUtility.font_10_bold));
questionTable.addCell(QuestionNrCell);
questionTable.addCell(QuestionPhraseCell);
//add topic to document
Document.add(questionTable)
//compose image
Image itextImage = GetImageForTopic(currentTOPIC); //let's assume this function returns an image!
Paragraph chartParagraph = new Paragraph();
chartParagraph.IndentationLeft = indentionForQuestionInfo;
chartParagraph.Add(itextImage);
//add image to document
Document.Add(chartParagraph);
}
答案 0 :(得分:6)
如果您有一个PdfWriter
实例(例如writer
),则需要强制iText使用严格的图像序列,如下所示:
writer.setStrictImageSequence(true);
否则,iText会推迟添加图片,直到页面上有足够的空间来添加图片。
答案 1 :(得分:0)
那是相当不直观......我得到了同样的行为。那么为什么不在每次迭代时向表中添加另一行:
for (int i = 1; i < 5; ++i) {
PdfPTable questionTable = new PdfPTable(2) {
// try and keep topic & chart together on same page for each iteration
KeepTogether = true,
WidthPercentage = 100
};
questionTable.SetWidths(new int[] { 4, 96 });
// _defaultCell():
// sets BorderWidth/HorizontalAlignment/VerticalAlignment
// same as your example
PdfPCell QuestionNrCell = _defaultCell();
QuestionNrCell.AddElement(new Paragraph(string.Format("{0}. ", i)));
PdfPCell QuestionPhraseCell = _defaultCell();
QuestionPhraseCell.AddElement(new Paragraph(string.Format("{0}", s)));
Image itextImage = Image.GetInstance(imagePath);
// second parameter used so image is NOT scaled
PdfPCell imageCell = new PdfPCell(itextImage, false) {
Border = Rectangle.NO_BORDER,
Colspan = 2, PaddingLeft = indentionForQuestionInfo
};
questionTable.AddCell(QuestionNrCell);
questionTable.AddCell(QuestionPhraseCell);
questionTable.AddCell(imageCell);
document.Add(questionTable);
}