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

Pdf 如何在itextsharp中设置两个块之间的行间距,pdf,itextsharp,Pdf,Itextsharp,我正在使用iTextSharp创建PDF。这是一个报告工具。一切都很好,只是两块之间的空间比我想要的稍微大一些。我试图在StackOverflow上找到一些帮助,并了解了SetLeading(固定,相乘)但它不附带块,以防万一 我之所以需要它在chunk中,是因为我有多个chunk,我正在将它们添加到段落中,然后一次将所有内容添加到文档中 public static void createPDF(Paragraph para) { string imagepath = "

我正在使用iTextSharp创建PDF。这是一个报告工具。一切都很好,只是两块之间的空间比我想要的稍微大一些。我试图在StackOverflow上找到一些帮助,并了解了
SetLeading(固定,相乘)但它不附带
,以防万一

我之所以需要它在chunk中,是因为我有多个chunk,我正在将它们添加到段落中,然后一次将所有内容添加到文档中

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 {


        }
    }
publicstaticvoidcreatepdf(第段)
{
字符串imagepath=“12.pdf”;
单据单据=新单据();
尝试
{
第p段=第2段;
矩形[]列={
新矩形(36,36,290,806),
新矩形(305、36、559、806)
};
//这就是我尝试过的
//p.SetLeading(0.4f,0.8f);
p、 间距前=0.0f;
p、 间隔时间=0.1f;
PdfReader inputPdf=新PdfReader(@“”);
PdfWriter writer2=PdfWriter.GetInstance(doc,newfilestream(imagepath,FileMode.Create));
doc.Open();
PdfContentByte canvas=writer2.DirectContent;
对于(int ij=1;ij请阅读。
对象被称为iText的高级对象中的原子构建块。根据设计,您不能在
的级别上定义前导

我引述第23页:

不知道两行之间需要多少空间

前导是在
短语
(当然还有它的超类,例如
段落
)的级别定义的。如果要更改
对象之间的间距,需要在
短语
段落
中换行
s(如您已经指出的)并定义这些短语或段落的开头

请注意,文件还说明:

在正常情况下,您将使用
Chunk
对象来组合其他文本对象,例如
短语
s和
段落
s。通常,您不会将
Chunk
对象直接添加到
文档

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

额外备注

  • 您正在以一种丢弃所有现有交互的方式导入现有PDF。这是次优的
  • 您首先编写一段
    p
    ,为
    p
    设置前导,然后分解p扔掉您定义的前导,然后抱怨没有前导
  • 这就是你做错的地方:

    while (paragraphs < p.Count-1)
    {
        ct.AddElement(p[i]);
        ...
    }
    
    由于已在
    p
    对象级别定义了前导,因此必须将
    p
    对象作为元素添加到
    ColumnText


    关于复制原始文档的错误方式:该示例演示了如何正确操作。您可以为现有文档获取一个
    PdfReader
    对象。您可以创建一个
    PdfStamper
    来创建一个新文档。您可以获取现有文档中的页数,然后使用
    insertPage()
    添加额外内容所需的时间。

    好的,先生。我纠正了我的错误。现在我在段落中添加块,并尝试在段落中设置SetLeading,如下
    p.SetLeading(0f,0.8f)
    但它没有做任何更改为什么?您使用的是哪个版本的iTextSharp?在旧版本中,该方法只在
    ColumnText
    的上下文中起作用。您需要一个最新版本。您没有机会使用过时的iText分支,是吗?我不喜欢您导入现有PDF的方式。我不想回答这些问题这是因为您没有使用
    PdfWriter
    而不是
    PdfStamper
    。另外:您首先编写
    p
    ,设置
    p
    的前导,然后分解
    p
    扔掉您定义的前导,然后抱怨没有前导。这相当于有人得到一块蛋糕,吃了它,然后抱怨他没有得到蛋糕……我已经更新了答案,但以后提问时请更加准确。
    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]);
    }