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