用C#制作PDF文件全攻略(转)

用C#制作PDF文件全攻略(转)

iTextSharp是一款开源PDF操作类库,使用它可以快速的创建PDF文件。

 

中文参考网站:http://hardrock.cnblogs.com/

 

 

http://pdfhome.hope.com.cn/Article.aspx?CID=bf51a5b6-78a5-4fa3-9310-16e04aee8c78&AID=f5fe52dd-8419-4baa-ab1c-ea3f26952132

 

 

英文参考网站:http://itext.ugent.be/library/

 

 

· 技术文章(http://itext.ugent.be/articles/

 

 

· 在线示例 (http://itextdocs.lowagie.com/tutorial/

 

 

· 英文API(http://itext.ugent.be/library/api/

 

 

iTextSharp常用对象:

 

 

Document:(文档)生成pdf必备的一个对象。

 

 

生成一个Document示例。
Document document = new Document(PageSize.A4, 30, 30, 5, 5);
打开当前Document
document.Open();
为当前Document添加内容:
document.Add(new Paragraph("Hello World"));
关闭Document
document.Close();

Chunk()是能被添加到(Document文档的文本的最小单位,块可以用于构建其他基础元素如(Paragraph)段落。
创建了一个内容为“hello World”、红色、斜体、COURIER字体、尺寸20的一个块:

Chunk chunk = new Chunk("Hello world", FontFactory.GetFont(FontFactory.COURIER, 20, Font.ITALIC, new Color(255, 0, 0)));
document.Add(new Paragraph(chunk));

Paragraph:(段落)段落是一系列块构成,段落有确定的间距。段落可以左对齐、右对齐和居中对齐。添加到文档中的每一个段落将自动另起一行。

     //构建一个段落实例
                 Paragraph ph1 = new Paragraph();
                 //构建块"chunk1"
                 Chunk chunk1 = new Chunk("Hello world", FontFactory.GetFont(FontFactory.COURIER, 20, Font.ITALIC, new Color(255, 0, 0)));
                 //向块中追加内容
chunk1.Append(" Hello Mi");
                //构建块"chunk2"
                Chunk chunk2 = new Chunk(" Word hello", FontFactory.GetFont(FontFactory.COURIER, 20, Font.ITALIC, new Color(255, 255, 0)));
                //向块中追加内容
                chunk2.Append(" Hello Mi");
                //将块加入到段落中
                ph1.Add(chunk1);
                ph1.Add(chunk2);
                //构建一个图片对像实例
                Image jpg1 = Image.GetInstance("myKids.jpg");
                jpg1.Alignment = Element.ALIGN_CENTER;
                ph1.Add(jpg1);
                //设定段落的间距
                ph1.Leading = 14;
                //段落左对其
                ph1.Alignment = Element.ALIGN_CENTER;
                //将段落添加到pdf文档中显示出来
                document.Add(ph1);
Image gif = Image.getInstance("vonnegut.gif");
                Image jpeg = Image.getInstance("myKids.jpg");
                Image png = Image.getInstance("hitchcock.png");
                jpeg.ScalePercent(10);//将图片按%大小显示。
                jpeg.SetAbsolutePosition(0, 0);// 图片放要页面上一个绝对位置(0,0)
           jpeg.Alignment = Image.ALIGN_TOP;//设置图片的对其方式。

Table:(表格)Pdf里面重要的布局对象。
<!---下面演示如何根据htm的<table></table>生成对应的pdf。-->
<table width="595" border="0" cellpadding="3" cellspacing="2">
   <tr>
     <td   colspan="3"   ><img src="surfing.gif" /></td>
   </tr>
   <tr>
     <td width="60%" rowspan="2" bgcolor="#00CC99">aaaaaa</td>
     <td width="20%" height="48">bbbbb</td>
     <td width="20%">cccccc</td>
   </tr>
   <tr>
     <td >dddd</td>
     <td>eeeeee</td>
   </tr>
</table>
//定一个3行,列的表格
                //创建一个表格最通用的办法是预先知道有几行几列:
                //public Table(int columns, int rows);

                Table tb1 = new Table(3, 3);
                //设定表格的总体宽度
                tb1.AbsWidth = "595";
                tb1.Cellpadding = 2;
                tb1.Cellspacing = 3;
                //定义表格各个列的宽度
                tb1.Widths=new float[]...{60,20,20};
                //定义表格的bord的宽度为
                //定义表格的bord的宽度为tb1.BorderWidth =1;
                tb1.Border = Rectangle.NO_BORDER;
                tb1.DefaultCellBorder = Rectangle.NO_BORDER;

 

 

                Image top1 = Image.GetInstance("surfing.gif");
                Cell cell = new Cell(top1);

cell.Colspan = 3;
     

                tb1.AddCell(cell);

 

 

                cell = new Cell(new Paragraph("aaaaaa"));
                cell.Rowspan = 2;
                System.Drawing.ColorConverter htmColor = new System.Drawing.ColorConverter();
                Color pdfColor=new Color((System.Drawing.Color)htmColor.ConvertFromString("#00CC99"));
                cell.BackgroundColor = pdfColor;
                cell.HorizontalAlignment = Element.ALIGN_RIGHT;
           

                tb1.AddCell(cell);

 

 

                cell = new Cell(new Paragraph("bbbbb"));
                cell.Leading = 48;
               

                tb1.AddCell(cell);

 

 

                cell = new Cell(new Paragraph("cccccc"));
                tb1.AddCell(cell);

 

 

                cell = new Cell(new Paragraph("dddd"));
                tb1.AddCell(cell);

 

 

                cell = new Cell(new Paragraph("eeeeee"));
                tb1.AddCell(cell);

 

 

             document.Add(tb1);

 


 

PdfPTable:Table对象可以转化成PdfPTable,因为现在的类库的PdfPTable不支持rowspan大于1,所以转化的table的rowspan不能大于1,PdfPTable可以浮动在pdf页的任意

PdfWriter writer = PdfWriter.GetInstance(document, new FileStream("Chap0103.pdf", FileMode.Create));
                document.Open();
            //定义一个1列2行的table
                Table tb1 = new Table(1, 2);
                //设定表格的总体宽度
                tb1.AbsWidth = "595";
                tb1.Cellpadding = 2;
                tb1.Cellspacing = 3;
                //定义表格各个列的宽度
              

                tb1.Border = Rectangle.NO_BORDER;
                tb1.DefaultCellBorder = Rectangle.NO_BORDER;
                Cell cell = new Cell(new Paragraph("kkkkkkkkk"));
                System.Drawing.ColorConverter htmColor = new System.Drawing.ColorConverter();
                Color pdfColor = new Color((System.Drawing.Color)htmColor.ConvertFromString("#00CC99"));
                cell.BackgroundColor = pdfColor;
                cell.Leading = 14;
                tb1.AddCell(cell);
                cell = new Cell(new Paragraph("bbbbb"));
                cell.Leading = 14;
                tb1.AddCell(cell);
                 //允许转换PdfPTable
                tb1.Convert2pdfptable = true;
                //转换为PdfPTable
                PdfPTable ptbm = tb1.CreatePdfPTable();

 



 

ptbm.SetTotalWidth(new float[] ...{595});
                ptbm.WriteSelectedRows(0, -1, document.LeftMargin + 100, document.BottomMargin + 400, writer.DirectContent);

 

 

IPdfPageEvent:这是一个重要的接口,它定义了的方法有

 

 


IPdfPageEvent Members#region IPdfPageEvent Members

 

 

        public void OnOpenDocument(PdfWriter writer, Document document)
        ...{
        

        }

 

 

        public void OnCloseDocument(PdfWriter writer, Document document)
        ...{
         

        }

 

 

        public void OnParagraph(PdfWriter writer, Document document, float paragraphPosition)
...{
            // TODO: Add PageNumbersWatermark.OnParagraph implementation
        }

 

 

        public void OnEndPage(PdfWriter writer, Document document)
        ...{
              

        }

 

 

        public void OnSection(PdfWriter writer, Document document, float paragraphPosition, int depth, Paragraph title)
        ...{
            // TODO: Add PageNumbersWatermark.OnSection implementation
        }

 

 

        public void OnSectionEnd(PdfWriter writer, Document document, float paragraphPosition)
        ...{
            // TODO: Add PageNumbersWatermark.OnSectionEnd implementation
        }
public void OnParagraphEnd(PdfWriter writer, Document document, float paragraphPosition)
        ...{
            // TODO: Add PageNumbersWatermark.OnParagraphEnd implementation
        }

 

 

        public void OnGenericTag(PdfWriter writer, Document document, Rectangle rect, string text)
        ...{
            // TODO: Add PageNumbersWatermark.OnGenericTag implementation
        }

 

 

        public void OnChapterEnd(PdfWriter writer, Document document, float paragraphPosition)
        ...{
            // TODO: Add PageNumbersWatermark.OnChapterEnd implementation
        }

 

 

        public void OnChapter(PdfWriter writer, Document document, float paragraphPosition, Paragraph title)

...{
            // TODO: Add PageNumbersWatermark.OnChapter implementation
        }

 

 

        public void OnStartPage(PdfWriter writer, Document document)
        ...{
         

        }

 

 

        #endregion

 

 


设定生成pageEvent

 


 

PdfWriter writer=PdfWriter.GetInstance(document, new FileStream(FileUrl, FileMode.Create));
       //页面事件指向IPdfPageEvent接口
        writer.PageEvent = this;

PdfWriter writer=PdfWriter.GetInstance(document, new FileStream(FileUrl, FileMode.Create));
        //页面事件指向IPdfPageEvent接口
         writer.PageEvent = this;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用第三方库iTextSharp来将OFD文件换成PDF文件。首先需要将OFD文件解压缩,然后将解压缩后的XML文件换成PDF文件。 以下是一个示例代码: ```csharp using iTextSharp.text; using iTextSharp.text.pdf; using System.IO; using System.Xml; public static void ConvertOFDToPDF(string ofdFilePath, string pdfFilePath) { // 解压缩OFD文件 string tempFolderPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); Directory.CreateDirectory(tempFolderPath); ZipFile.ExtractToDirectory(ofdFilePath, tempFolderPath); // 获取OFD文档的页面尺寸 string documentXmlPath = Path.Combine(tempFolderPath, "Documents", "Document.xml"); XmlDocument documentXml = new XmlDocument(); documentXml.Load(documentXmlPath); XmlNamespaceManager nsManager = new XmlNamespaceManager(documentXml.NameTable); nsManager.AddNamespace("ofd", "http://www.ofdspec.org"); XmlNode pageAreaNode = documentXml.SelectSingleNode("/ofd:Document/ofd:Pages/ofd:PageArea", nsManager); float pageWidth = float.Parse(pageAreaNode.Attributes["PageWidth"].Value); float pageHeight = float.Parse(pageAreaNode.Attributes["PageHeight"].Value); // 创建PDF文档 using (FileStream pdfFileStream = new FileStream(pdfFilePath, FileMode.Create)) { using (Document pdfDocument = new Document(new Rectangle(pageWidth, pageHeight))) { using (PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDocument, pdfFileStream)) { pdfDocument.Open(); // 遍历OFD文档的页面,将每个页面换成PDF页面 XmlNodeList pageNodes = documentXml.SelectNodes("/ofd:Document/ofd:Pages/ofd:Page", nsManager); foreach (XmlNode pageNode in pageNodes) { string pageFileNodeValue = pageNode.Attributes["BaseLoc"].Value; string pageFilePath = Path.Combine(tempFolderPath, pageFileNodeValue); using (FileStream pageFileStream = new FileStream(pageFilePath, FileMode.Open)) { using (MemoryStream pageMemoryStream = new MemoryStream()) { pageFileStream.CopyTo(pageMemoryStream); byte[] pageBytes = pageMemoryStream.ToArray(); // 将OFD页面换成PDF页面 using (MemoryStream pdfMemoryStream = new MemoryStream()) { using (Document pageDocument = new Document()) { using (PdfWriter pdfPageWriter = PdfWriter.GetInstance(pageDocument, pdfMemoryStream)) { pageDocument.Open(); using (MemoryStream pageXmlStream = new MemoryStream(pageBytes)) { XmlDocument pageXml = new XmlDocument(); pageXml.Load(pageXmlStream); XmlNode pageContentNode = pageXml.SelectSingleNode("/ofd:Page/ofd:Content", nsManager); string pageContent = pageContentNode.InnerXml; using (MemoryStream pageContentStream = new MemoryStream()) { using (StreamWriter pageContentWriter = new StreamWriter(pageContentStream)) { pageContentWriter.Write(pageContent); pageContentWriter.Flush(); pageContentStream.Position = 0; XmlParserContext xmlParserContext = new XmlParserContext(null, nsManager, null, XmlSpace.None); XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); xmlReaderSettings.ConformanceLevel = ConformanceLevel.Fragment; using (XmlReader xmlReader = XmlReader.Create(pageContentStream, xmlReaderSettings, xmlParserContext)) { while (xmlReader.Read()) { if (xmlReader.NodeType == XmlNodeType.Element) { string elementName = xmlReader.Name; if (elementName == "ofd:TextObject") { string fontId = xmlReader.GetAttribute("Font"); string fontSizeString = xmlReader.GetAttribute("Size"); float fontSize = float.Parse(fontSizeString); string fontFamily = null; XmlNode fontNode = documentXml.SelectSingleNode($"/ofd:Document/ofd:Fonts/ofd:Font[@ID='{fontId}']", nsManager); if (fontNode != null) { fontFamily = fontNode.Attributes["FontName"].Value; } if (string.IsNullOrEmpty(fontFamily)) { fontFamily = "宋体"; } BaseFont baseFont = BaseFont.CreateFont($"{fontFamily},Bold", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); Font font = new Font(baseFont, fontSize); string text = xmlReader.ReadElementContentAsString(); pdfDocument.Add(new Paragraph(text, font)); } else if (elementName == "ofd:PathObject") { // 处理OFD路径对象 } else if (elementName == "ofd:ImageObject") { // 处理OFD图像对象 } } } } } } } pageDocument.Close(); } } byte[] pdfBytes = pdfMemoryStream.ToArray(); PdfReader pdfReader = new PdfReader(pdfBytes); pdfWriter.DirectContent.AddTemplate(pdfWriter.GetImportedPage(pdfReader, 1), 0, 0); } } } } pdfDocument.Close(); } } } Directory.Delete(tempFolderPath, true); } ``` 请注意,这段代码只是一个示例,可能需要根据你的具体情况进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值