ColumnTextを使用してDirectContentに書き込んでも、PdfDocument.GetVerticalPositionは更新されません。
-
06-07-2019 - |
質問
ITextSharpを使用してPDFを生成しており、ColumnTextを介してDirectContentを使用する必要がある状況があります。
問題は、ColumnTextオブジェクトを介してテキストを書き込んだ後、PdfDocument.GetVerticalPositionが更新されていないことです。失敗する次のテストを参照してください。
public void TestGetVerticalPositionIsUpdated()
{
PdfContentByte cb = Writer.DirectContent;
var columnText = new ColumnText(cb);
float position1 = Writer.GetVerticalPosition(true);
columnText.SetSimpleColumn(Document.Left,
Document.Bottom,
Document.Right,
position1,
0,
Element.ALIGN_JUSTIFIED);
columnText.AddText(new Phrase("Test test test test test\nTest test test test test"));
columnText.Go();
float position2 = Writer.GetVerticalPosition(true);
Assert.AreEqual(position1, position2);
}
ドキュメントのcurrentHeightを更新するようにライターまたはドキュメントのいずれかに伝えるために、とにかくあります。
obvoiusソリューションは、PdfDocument.SetVerticalPositionが存在する場合のみ使用することでした:-)
または、DirectContentを使用する概念全体を誤解していますか?
ドキュメントの現在のY位置を更新できない場合、または自動的に更新されない場合、DirectContentにコンテンツを追加した後、PdfDocument.Addを使用できないようです。
解決
残念ながら、ドキュメントのcurrentHeightフィールドを操作することはできません。そのため、DirectContentを使用して絶対配置オブジェクトを挿入する場合、「強制」することはできません。絶対配置コンテンツの後に挿入されるドキュメントに追加される次のコンテンツ。
唯一の方法は、自分で垂直位置を追跡し、すべてのコンテンツを絶対に追加することだと思われます。
他のヒント
複数列テキストオブジェクトで列テキストオブジェクトを追跡できます。その後、残りのすべてのドキュメントオブジェクトをmctオブジェクトに配置します。
var mct = new MultiColumnText(yBottomOfColumnText, MultiColumnText.AUTOMATIC);
mct.AddSimpleColumn(doc.Left, doc.Right); //creates one column
for (int i = 0; i < 100; i++)
{
mct.AddElement(new Paragraph("Test Paragaph Goes HEREEEEEEEE")); //repeats 100 times for test purposes
}
doc.Add(mct);
所属していません StackOverflow