我正在使用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 {
}
}
答案 0 :(得分:2)
请阅读chapter 2 of my book。 {iT(1)}对象在iText的高级对象中称为 atomic 构建块。根据设计,您无法在 Chunk
的级别上定义潜在客户。
我引自第23页:
Chunk
不知道两行之间需要的空间。
前导是在Chunk
(当然还有超级类,例如Phrase
)的级别定义的。如果要更改Paragraph
个对象之间的间距,则需要将Chunk
包裹在Chunk
或Phrase
中(如您已指明的那样)并定义前导那些短语或段落。
请注意,文档还说明:
在正常情况下,您将使用
Paragraph
个对象来撰写其他文本对象,例如Chunk
和Phrase
。通常,您不会将Paragraph
个对象直接添加到Chunk
。
您有哪些特殊情况需要对此规则进行例外处理?
额外备注
Document
,然后设置p
的前导,然后您分解p扔掉您已定义的前导,然后您抱怨说有没领先。这就是你做错了:
p
对象while (paragraphs < p.Count-1)
{
ct.AddElement(p[i]);
...
}
知道它的领导;此对象的单独组件(p
,p[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
添加额外内容。