itextharp - 具有列的页面布局

我现在已经涵盖了许多涉及的许多基础知识在今天福彩字谜总汇中使用ITextSharp在下面列出的一系列文章中生成PDF文件。本文将通过使用列来查看额外的方法来提供对文档的格式。

在今天福彩字谜总汇中创建PDF - iTextSharp入门
iTextharp - 使用字体
iTextharp - 添加带有块,短语和段落的文本
列出ItextSharp.
iTextharp - 链接和书签
ITextSharp - 介绍表
iTextharp - 使用图像
Itextharp - 绘图形状和图形

最常见的是,在使用多个列时,您将想要添加文本布局的列,类似于报纸。 Itextharp具有一个多主题文本对象,这使得这很简单。所有您需要告诉它是最左边的列应该从10轴开始的地方,最右边的列应该结束,你希望列之间的空间以及所需的列。以下将2列添加到页面,然后添加第8次段落;

  

细绳 pdfpath = server.mappath( “pdfs” );

细绳 imagepath = server.mappath( “列” );

文档 doc = 新的 文档 ();

尝试

{

     pdfwriter. .getInstance(Doc, 新的 filestream (pdfpath +. “/columns.pdf”, filemode. 。创造));

   doc.Open();

     段落 标题= 新的 段落 (“页面标题”, 新的 字体 ( 字体 .helvetica,28f, 字体 。大胆的));

   标题.SpacingAfter = 18F;

   doc.Add(heading);

     细绳 文字= @“Lorem非常胡萝卜,改善生态环境。压力坐在丑中。为了蛋糕作为消费者的氢饮料。足球从未容易容易,老挝,资产和拉扯它有趣。没有精英,氢胡萝卜,层,SEM,自由。现在的足球刚毕业。只有欧盟,请不要容易,足球局,痛苦扣除巨大。ID他毕业的直径和痛苦。整数Mauris超越或,栅极灭痛自由。Nibh本科和笔记本生活投资直径。和丑陋的饼干化妆作者!足球执行胡萝卜直径。为了他,最新的是电视。没有微笑花生,柔软的是悲伤的需要锅。SED制造蛋白质。狮子微波想要退款吗?“;

    多主题文本 列= 新的 多主题文本 ();

    //漂浮,浮动右,浮动旗宽,int numcolumns

   columns.addregularColumns(36f,doc.pageSize.width-36f,24f,2);

     段落 段= 新的 段落 (文本, 新的 字体 ( 字体 .helvetica,8f));

   para.spacingAfter = 9f;

   para.Alignment = 元素 .Align_justified;

     为了 ( i = 0; i < 8; i++)

    {

       columns.addelement(para);

    }

    

   doc.Add(columns);

    

}

抓住 ( 例外 ex)

{

   //log(ex.message);

}

最后

{

   doc.Close();

}

  

 结果显示,一旦填充第一列,就如何从一列从一列流到另一列。

addRegularColumns()将在完全相同的宽度下设置每个列。 AddSimpleColumn()允许您指定单个列的宽度,这意味着您可以使用不规则的大小列:

  

columns.addsimplecolumn(36f,170f);

columns.addsimplecolumn(194f,doc.pageSize.width - 36f);

  

上面的代码替换了前面块中的addRegularColumn()调用,并创建两个单独的列对象。第一个在左边缘开始(左边缘36点),宽2英寸(170-36 = 144分)。第二柱进一步启动24分(1/3的一英寸),并抵抗右手边缘。

添加其他元素(如图像和表)很简单:

 

细绳 pdfpath = server.mappath( “pdfs” );

细绳 imagepath = server.mappath( “图片” );

文档 doc = 新的 文档 ();

尝试

{

   pdfwriter. .getInstance(Doc, 新的 filestream (pdfpath +. “/columns.pdf”, filemode. 。创造));

  doc.Open();

   段落 标题= 新的 段落 (“页面标题”, 新的 字体 ( 字体 .helvetica,28f, 字体 。大胆的));

  标题.SpacingAfter = 18F;

  doc.Add(heading);

   细绳 文字= @“Lorem非常胡萝卜,改善生态环境。压力坐在丑中。为了蛋糕作为消费者的氢饮料。足球从未容易容易,老挝,资产和拉扯它有趣。没有精英,氢胡萝卜,层,SEM,自由。现在的足球刚毕业。只有欧盟,请不要容易,足球局,痛苦扣除巨大。ID他毕业的直径和痛苦。整数Mauris超越或,栅极灭痛自由。Nibh本科和笔记本生活投资直径。和丑陋的饼干化妆作者!足球执行胡萝卜直径。为了他,最新的是电视。没有微笑花生,柔软的是悲伤的需要锅。SED制造蛋白质。狮子微波想要退款吗?“;

  多主题文本 列= 新的 多主题文本 ();

  columns.addsimplecolumn(36f,336f);

  columns.addsimplecolumn(360f,doc.pageSize.width - 36f);

  

   段落 段= 新的 段落 (文本, 新的 字体 ( 字体 .helvetica,8f));

  para.spacingAfter = 9f;

  para.Alignment = 元素 .Align_justified;

  

   pdfptable. 表= 新的 pdfptable. (3);

   漂浮 []宽度= 新的 漂浮 [] {1f,1f,1f};

  table.totalwidth = 300f;

  table.LockedWidth = 真的 ;

  table.setwidths(宽度);

   pdfpcell. 细胞= 新的 pdfpcell. ( 新的 短语 (“跨越3列的标题” ));

  cell.Colspan = 3;

  cell.horizo​​ntalalignment = 0;

  table.AddCell(cell);

  table.AddCell(“col 1行1” );

  table.AddCell(“Col 2第1行” );

  table.AddCell(“Col 3第1行” );

  table.AddCell(“Col 1第2行” );

  table.AddCell(“Col 2第2行” );

  table.AddCell(“Col 3第2行” );

  

   图像 JPG = 图像 .getInstance(ImagePath + “/sunset.jpg” );

  JPG.Scaletofit(300F,300F);

  JPG.SpacingAfter = 12F;

  jpg.spacingBefore = 12f;

  

  columns.addelement(para);

  columns.addelement(表);

  columns.addelement(JPG);

  columns.addelement(para);

  columns.addelement(para);

  columns.addelement(para);

  columns.addelement(para);

  doc.Add(columns);

  

}

抓住 ( 例外 ex)

{

  //log(ex.message);

}

最后

{

  doc.Close();

}

 

 上面的示例采用了前一个教程的表和图像,并将它们与列中的段落一起添加到列中。第一列为300分,第二个列占据了页面宽度的其余部分。

MulticulumnText非常适合创建列而没有太多代码,但它缺少控制元素。 ColumnText提供更多,但需要更多代码。以下示例显示用于创建不规则列的列文本,因为第一个从左上角拍摄块以容纳映像,该图像在此处在结果的PDF中显示;

 

细绳 pdfpath = server.mappath( “pdfs” );

细绳 imagepath = server.mappath( “图片” );

fontfactory. .RegisterDirectory(“C:\\ Windows \\ fonts” );

 

文档 doc = 新的 文档 ();

字体 font1 = 新的 字体 ( fontfactory. .getfont( “Adobe Garamond Pro”, 36f, 颜色 。灰色的));

字体 font2 = 新的 字体 ( 字体 .times_roman,9f);

doc.setmargins(45f,45f,60f,60f);

尝试

{

  filestream 输出= 新的 filestream (pdfpath +. “/ riregularColumns.pdf”, filemode. 。创造);

  pdfwriter. 作家= pdfwriter. .getInstance(Doc,输出);

  doc.Open();

  pdfcontentbyte. CB = Writer.DirectContent;
  CLOUPTEXT. ct = 新的 CLOUPTEXT. (CB);

  ct.Alignment = 元素 .Align_justified;

 

  段落 标题= 新的 段落 ( “第1章” ,font1);

 标题.Leading = 40f;

  doc.Add(heading);

  图像 l = 图像 .getInstance(ImagePath + “/l.gif” );

 l.setabsoluteposition(doc.left,doc.top - 180);

  doc.Add(L);

 

  ct.AddText( 新的 短语 (“让我们做网络管理,改善生态环境。压力坐在丑中。为了蛋糕作为消费者氢饮料。足球从未容易容易,老挝,资产和,将其搞笑。没有精英,氢胡萝卜,层网格,justo Convallis坐在贝斯托,利维斯·苏斯卡。Nunc Dignissim海丁Lectus。Quisque Gravida Mus,除了; Commodo Non,Porta非,战略利益,标题悬挂eLeifend NISI和大。Phasellus ID Lectus!Vivamus Laoreet和悲伤。Integer Arcu Mauris,Ultricies Vel门,自由灭菌。NIBH的本科和笔记本生活在直径上投资。和丑陋的饼干化妆作者!胡萝卜直径的足球执行。最新的是电视。没有微笑花生柔软,谁将坐在哀悼所需锅。SED制造蛋白质。狮子微波想要退款!\ n \ n“ ,font2));

  ct.AddText( 新的 短语 (“成员或者,山谷没有软,宣传,微波炉没有。继电器元素表现是。最新的Malesuada扣除而不是那个!Nulla。茉莉花,因为它是丑陋的。Maecenas热临床红萝卜宣传的衣服时间。有时家庭作业经济。临床说足球比赛。足球,但痛苦。临床伟大。没有地区丑陋,房地产和免除,生态生活有趣。\ n \ n“ ,font2));

  ct.AddText( 新的 短语 (“中继胡萝卜对巧克力酱局的恐惧。Jasmine狙击手,来自Mollis的Lorem,现在担心局部,这是很多篮球Lorem Region裙子。这是重要的硬件。中档。射手裙。Sagittis欧盟渔业。按摩禅。但是,如果氢狮子足球。压力肿块,而是很多好吃的东西!潜水潜水酱丑陋。现在宣传!Maecenas Massa非常悲伤。\ n \ n“ ,font2));

  ct.AddText( 新的 短语 (“Donec Imperdiet Purus Veltigula。前院Tilk,Odio UT Scelerisque Eleifend,Nulla Sapien Laoreet Dui; Veliquam Arecu Libero欧盟Ante。Curabitur Rutrum TriStique Mi。Sed Lobortis Iaculis Arcu。Susionisse Mauris。Aliqueam Metus Lacus,Elementum Quis,Mollis非,Mollis非,结果NEC,托尔托尔。\ n“ ,font2));

  ct.AddText( 新的 短语 (“无论是谁直径。从开发人员的秩序执法狮子中。在这种恐惧中。最新的有针对性的电影不是宣传。从现在开始的模型?ID EROS。造成影响。家庭作业足球,我的。零陵。罗拉。Lorem Ipsum胡萝卜,提高本科。开发人员。秘密就业通过我们的婚姻扭曲,每个Himenaeos。茉莉花脚。空荡荡的房地产本科零。目前临床前线,房地产在课程网格,但被设置,开始。\ n \ n“。 ,font2));

  ct.AddText( 新的 短语 (“Nulla。现在层笑声比那样。对于孩子们!波特特托特。整数et libero赌注。Nam承担了投资区域。生活在直径仇恨,一个男人收到一个被叫的足球,甚至是球员。甚至是球员。有时锅尼布。目前的车辆临床这种灭菌的篮球毛里斯壶柔软的湖泊,坐在那样。Sed Lorem足球,篮球人,怀孕和颤抖的生活比这。最大的释放他从颚卡车,毛里斯的孩子们颤抖。明天或响亮,或有时,或有时,各种各样的并且,漏血是。每个锅。乳液。没有悲伤的辣椒,但丑陋!SED Life的价值。继电器硬件。\ n \ n“ ,font2));

  ct.AddText( 新的 短语 (“在第一次尝试临床哀悼和篮球之前设立了他们的照顾,但需要:我的沙拉瞄准局。Nulla。即使是开发人员。在卡通蛋白质萨佩恩。最新的,但只是为了适应它的超级生活,它很重要,它很重要,笑声!当林下拉扯超级碗山脉。托架。宣传的东西价格,而不是我。但是很棒。再融资。每个质量。它也在之前拉伸直径颤抖。Nam Ecological想要讨厌!那是零。\ n \ n“ ,font2));

  ct.AddText( 新的 短语 (“完美的宣传。足球临床。但是尼比。继电器,并用它狮子钳口电脑。商业需求现在容易喝的胡萝卜。零谷我。当拉射线超级碗山时。住在那里。保留最大的洛雷姆,孩子们总是,但是,坦克定制治疗。乳液。例如,中生,例如。如果足球胡萝卜或Playstation。\ n \ n“ ,font2));

 

  漂浮 gutter = 15f;

  漂浮 Colwidth =(doc.right - doc.left - gutter)/ 2;

  漂浮 [] left = {doc.left + 90f,doc.top - 80f,

                 doc.left + 90f,doc.top - 170f,

                 doc.left,doc.top - 170f,

                 doc.left,doc.bottom};

 

  漂浮 []右= {doc.left + colwidth,doc.top - 80f,

                   doc.left + colwidth,doc.bottom};

 

  漂浮 [] left2 = {doc.right - colwidth,doc.top - 80f,

                   doc.right - colwidth,doc.bottom};

 

  漂浮 [] right2 = {doc.right,doc.top - 80f,

                   doc.right,doc.bottom};

 

  地位 = 0;

  i = 0;

  //检查状态的值以确定是否有更多文本

  //如果存在,status是2,这是no_more_column的值

  尽管 ( CLOUPTEXT. .hasmoreText(状态))

  {

    如果 (i == 0)

    {

      //编写第一列

     ct.setColumns(左,右);

      i++;

    }

    别的

    {

      //写下第二列

     ct.setColumns(左2,右2);

    }

    //需要在这里来防止应用程序挂起

   ct.yline = doc.top - 80f;

    //提交列文本的内容到文档

    //ColumnText.Go() returns NO_MORE_TEXT (1) and/or NO_MORE_COLUMN (2)

    //换句话说,它填充了列,直到它不得用完列或文本或两者

    status = ct.Go();

  }

}

抓住 ( 例外 ex)

{

  //Log(ex.Message);

}

最后

{

  doc.Close();

}

 

Colupltext要求您需要一个pdfcontentyte对象,就像 图形和绘图。当您想要在固定位置放置内容时,这几乎是如此。上面的代码通过定义文档对象来开始,然后创建一些与之合作的字体,以及设置文档的边距(在打开文档生效之前需要完成)。创建PDFWriter PDFContentByte对象,以便可以从其DirectContent属性实例化对象。 ColumnText然后使用pdfcontentbyte创建对象。添加标题,然后是所示的资本"L",开始本章。随后是一些短语,如段落所示。

所以现在ColupeText对象具有其文本内容,但无处可存入它,因此已创建了两列。第一阵列的浮子阵列将第一列的左侧的不规则形状定义为顶角,该顶角已切断出来为图像发出方式。第二个阵列定义直右手边缘。第三和第四阵列照顾规则形状的第二柱。创建两个int变量以保持列的状态的值,了解是否有更多文本要添加( 地位 ),然后是当前正在进行的列的数量(i )。

columntext.hasmoreText(状态) 是一种作为参数的便利方法。它检查参数的值,以查看是否有更多要添加的文本并返回 真的 如果有。返回的值 错误的 是1.它以0开始初始化,因此HasmoreText退货 真的 。由于我也是0,因此代码执行要添加第一列,然后将Yline设置为列的顶部。这必须完成,否则应用程序将只是旋转,直到发生执行超时。最后,调用ColumnText.go()方法。这实际上将ColupeText的内容提交给文档,并且还将值返回到变量 地位 。它返回no_more_text,它是1和/或no_more_column(2)。如果返回NO_MORE_TEXT,则写入所有内容,否则将创建第二列并将文本添加到该中。一旦ColuplEtext.hasmoreText返回false,写入页面。

构建此内容,如果文本数量跨越多个页面,则可以将例程重写为调用document.newpage(),如果在将每个短语添加到列的对象后调用go(),则可以获得页面上当前的y位置,以确定有多少房间左侧。这使您可以管理寡妇和孤儿 - 单行文本属于出现在前面页面或列(孤儿)末尾的段落或显示在新页面或列的顶部(寡妇)。也可以通过参数"false"进入(),不会将文本提交到列,但仍然允许您获取位置,好像它是允许您对布局更精细的控制。