書式設定のバグに気付いたとき、iText ドット ネット ライブラリを使用していました。問題を示す小さなプロジェクトで再現できました。
ページの高さよりも大きいグリッドが 1 つ以上あり、そのグリッドで SetKeepTogether(true) を呼び出すと、奇妙な方法で複数のテーブルが重なっているように見えます。SetKeepTogether(false) が呼び出された場合、レンダリングの問題は発生しませんが、テーブルがページの境界を超えて拡張される場合は、テーブルを新しいページに分割する必要があります。
この例では、CAUSE_BUG という静的ブール値を宣言しました。true に設定すると、欠陥のある PDF が生成されます。false に設定すると、ページ内にかろうじて収まるテーブルが生成され、レンダリングの問題は発生しません。
どういうわけかライブラリを間違って使用していますか? もしそうなら、どうすればこの問題を修正できますか?
const bool CAUSE_BUG = true;
const string DEST = "sample.pdf";
const int COL_COUNT = 5;
static void Main(string[] args)
{
FileInfo file = new FileInfo(DEST);
file.Directory.Create();
PdfWriter writer = new PdfWriter(DEST);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf, PageSize.Default.Rotate());
document.Add(CreateTable(4));
document.Add(CreateTable(8));
if (CAUSE_BUG)
{
// The bug happens when one or more tables that are marked to keep together extend
// past the boundary of the page's height. 21 rows is just over the page height.
document.Add(CreateTable(21));
document.Add(CreateTable(21));
document.Add(CreateTable(21));
}
else
{
// These grids should barely fit in a single page which will cause them to render nicely.
document.Add(CreateTable(20));
document.Add(CreateTable(20));
document.Add(CreateTable(20));
}
document.Close();
}
private static Table CreateTable(int rows)
{
Table t = new Table(COL_COUNT);
t.SetWidthPercent(100);
Cell topCell = new Cell(1, COL_COUNT);
topCell.Add("FULL WIDTH HEADER");
topCell.SetBorder(Border.NO_BORDER);
topCell.SetBold();
t.AddHeaderCell(topCell);
Cell threeWide = new Cell(1, 3);
threeWide.Add("Three Wide");
threeWide.SetBold();
t.AddHeaderCell(threeWide);
Cell twoWide = new Cell(1, 2);
twoWide.Add("Two Wide");
twoWide.SetBold();
t.AddHeaderCell(twoWide);
// Add dummy rows
for (int rowIndex = 0; rowIndex < rows; rowIndex++)
{
for (int i = 0; i < COL_COUNT; i++)
{
t.AddCell(string.Format("R{0} C{0}", rowIndex, i));
}
t.StartNewRow();
}
// Setting this to false will fix the issue
t.SetKeepTogether(true);
return t;
}