如何在itextsharp中设置两个块之间的行间距

时间:2014-06-05 09:40:27

标签: pdf itextsharp

我正在使用iTextSharp创建PDF。这是一个报告工具。一切都很好,只有两个块之间的空间比我想要的要大得多。我试图在StackOverflow上找到一些帮助,并且知道了SetLeading(fixed, multiplied);但是它不会随chunk一起出现。

我在块中需要它的原因是我有多个块,我将其添加到段落中,一次性将所有块添加到Document中。

public static void createPDF(Paragraph para)
    {
        string imagepath = "12.pdf";
        Document doc = new Document();
        try
        {

            Paragraph p = para;
            Rectangle[] COLUMNS = {
            new Rectangle(36, 36, 290, 806),
            new Rectangle(305, 36, 559, 806)
          };

           //This is what i have tried
           // p.SetLeading(0.4f,0.8f);
            p.SpacingBefore = 0.0f;
            p.SpacingAfter = 0.1f;

            PdfReader inputPdf = new PdfReader(@"");
            PdfWriter writer2 = PdfWriter.GetInstance(doc, new FileStream(imagepath, FileMode.Create));



            doc.Open();
            PdfContentByte canvas = writer2.DirectContent;
            for (int ij = 1; ij <= 3; ij++)
            {
                doc.SetPageSize(inputPdf.GetPageSizeWithRotation(ij));
                doc.NewPage();

                PdfImportedPage page = writer2.GetImportedPage(inputPdf, ij);
                int rotation = inputPdf.GetPageRotation(ij);

                if (rotation == 90 || rotation == 270)
                {
                    canvas.AddTemplate(page, 0, -1f, 1f, 0, 0, inputPdf.GetPageSizeWithRotation(ij).Height);
                }
                else
                {
                    canvas.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                }
            }

            doc.NewPage();
            ColumnText ct = new ColumnText(canvas);
            int side_of_the_page = 0;
            ct.SetSimpleColumn(COLUMNS[side_of_the_page]);
            int paragraphs = 0;
            int i = 0;

            while (paragraphs < p.Count-1)
            {
                string TEXT = p[i].ToString();

                ct.AddElement(p[i]);
                while (ColumnText.HasMoreText(ct.Go()))
                {
                    if (side_of_the_page == 0)
                    {
                        side_of_the_page = 1;
                        canvas.MoveTo(297.5f, 36);
                        canvas.LineTo(297.5f, 806);
                        canvas.Stroke();
                    }
                    else
                    {
                        side_of_the_page = 0;
                        doc.NewPage();
                    }
                    ct.SetSimpleColumn(COLUMNS[side_of_the_page]);

                }
                i++;
                paragraphs++;

            }

            doc.Close();
        }
        catch {


        }
    }

1 个答案:

答案 0 :(得分:2)

请阅读chapter 2 of my book。 {iT(1)}对象在iText的高级对象中称为 atomic 构建块。根据设计,您无法在 Chunk的级别上定义潜在客户。

我引自第23页:

  

Chunk不知道两行之间需要的空间。

前导是在Chunk(当然还有超级类,例如Phrase)的级别定义的。如果要更改Paragraph个对象之间的间距,则需要将Chunk包裹在ChunkPhrase中(如您已指明的那样)并定义前导那些短语或段落。

请注意,文档还说明:

  

在正常情况下,您将使用Paragraph个对象来撰写其他文本对象,例如ChunkPhrase。通常,您不会将Paragraph个对象直接添加到Chunk

您有哪些特殊情况需要对此规则进行例外处理?

额外备注

  1. 您正在以抛弃所有现有交互性的方式导入现有PDF。这不是最理想的。
  2. 您首先撰写一个段落Document,然后设置p的前导,然后您分解p扔掉您已定义的前导,然后您抱怨说有没领先。
  3. 这就是你做错了:

    p

    对象while (paragraphs < p.Count-1) { ct.AddElement(p[i]); ... } 知道它的领导;此对象的单独组件(pp[0],...),对领先的内容一无所知。

    因此你应该这样做:

    p[1]

    由于您已在ColumnText ct = new ColumnText(canvas); int side_of_the_page = 0; ct.SetSimpleColumn(COLUMNS[side_of_the_page]); ct.AddElement(p); while (ColumnText.HasMoreText(ct.Go())) { if (side_of_the_page == 0) { side_of_the_page = 1; canvas.MoveTo(297.5f, 36); canvas.LineTo(297.5f, 806); canvas.Stroke(); } else { side_of_the_page = 0; doc.NewPage(); } ct.SetSimpleColumn(COLUMNS[side_of_the_page]); } 对象级别定义了前导,因此必须将p对象作为元素添加到p

    关于您复制原始文档的错误方式: AddLongTable示例显示了如何正确执行此操作。您将获得现有文档的ColumnText对象。您创建PdfReader以创建新文档。您获得现有文档中的页数,然后根据需要使用PdfStamper添加额外内容。