0

書式設定のバグに気付いたとき、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;
    }
4

0 に答える 0