惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
V
Visual Studio Blog
P
Privacy International News Feed
月光博客
月光博客
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
Lohrmann on Cybersecurity
N
News and Events Feed by Topic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Apple Machine Learning Research
Apple Machine Learning Research
阮一峰的网络日志
阮一峰的网络日志
Webroot Blog
Webroot Blog
T
Threatpost
宝玉的分享
宝玉的分享
The Last Watchdog
The Last Watchdog
小众软件
小众软件
L
LINUX DO - 最新话题
C
Cisco Blogs
T
Troy Hunt's Blog
Schneier on Security
Schneier on Security
酷 壳 – CoolShell
酷 壳 – CoolShell
www.infosecurity-magazine.com
www.infosecurity-magazine.com
雷峰网
雷峰网
G
GRAHAM CLULEY
有赞技术团队
有赞技术团队
Know Your Adversary
Know Your Adversary
博客园 - 叶小钗
罗磊的独立博客
V
V2EX
博客园 - Franky
P
Proofpoint News Feed
SecWiki News
SecWiki News
腾讯CDC
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Jina AI
Jina AI
博客园 - 三生石上(FineUI控件)
S
Secure Thoughts
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
PCI Perspectives
PCI Perspectives
V2EX - 技术
V2EX - 技术
Google DeepMind News
Google DeepMind News
Last Week in AI
Last Week in AI
aimingoo的专栏
aimingoo的专栏
Cisco Talos Blog
Cisco Talos Blog
N
News and Events Feed by Topic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
SegmentFault 最新的问题

博客园 - Tommy's Blog

正则表达式学习 常用的正则表达式字段 BBS List C# Learning Notes SharePoint Portal Server error message Microsoft TechNet中文网络广播 Learning C# Watched .NET componets [Idea] - online english recite Sample web page designers in China My goal 2005 Some google words JDK 1.5 notable new features.. Windows Scripting Google SEO digest Wallop invitation Favorite .NET open source projects My registered blogs 定制Internet Explorer扩展界面接口
PDF library
Tommy's Blog · 2004-12-21 · via 博客园 - Tommy's Blog

http://www.codeproject.com/dotnet/PdfLibrary.asp

Creating a PDF Document

Creating a PDF document can be divided into three steps.

  1. Writing the header of the PDF file.
  2. Creating pages of the document.
    1. Add text.
    2. Add table.
  3. Finish the document.

In each step, you open a file specifying the output file name. In the first step, it's is opened as create, and in every other step it is open as append. In PDF format, every object we create and write are referenced by the byte offset of that object within the file.

Step One

I will go by explaining the code sample for using the PDF library.


CatalogDict catalogDict=new CatalogDict();


PageTreeDict pageTreeDict=new PageTreeDict();


FontDict TimesRoman=new FontDict();
FontDict TimesItalic=new FontDict();


InfoDict infoDict=new InfoDict();


TimesRoman.CreateFontDict("T1","Times-Roman");


TimesItalic.CreateFontDict("T2","Times-Italic");


infoDict.SetInfo("title","author","company");


Utility pdfUtility=new Utility();


FileStream file=new FileStream(@"c:\text.pdf",FileMode.Create);
int size=0;
file.Write(pdfUtility.GetHeader("1.5",out size),0,size);
file.Close();

Create the pages in the document. Here we are creating only one page. This process can be repeated to include any number of pages. A page will have its contents. Contents are the text and table that we create. This content is an object of the type ContentDict. A page can have any number of ContentDicts, but two or more pages cannot have the same ContentDict.

Every page must be added to the PageTreeDict. This is the RootNode of the pages in the PDF Document structure. In a PDF document, there will be only one PageTree (created with this library). This is created by using PageTreeDict.AddPage(). The order of the page in the document will be in the order how there were added to the PageTree.

To every page, resources must be added. These resource include the font that must be used inside the page and the objects of the ContentDict. This is done by calling PageDict.AddResource. The font types that are to be used are specified in the library. In this library, only fonts of type Times New Roman will be correctly centered and right aligned. This is because, for aligning, we must have the width of all the character glimpses. I have stored only the width of Times New Roman.

In AddPage, we specify the objNum of the page to be added, and in AddResource, we add the objNum of the ContentDict.

For adding text and tables in the page, create an object of type TextAndTables. For adding text, call addText specifying the X and Y coordinates.

For adding table, first fill the parameters of the table using TableParams. In the constructor, specify the number of columns and their widths. If the widths are same then you can use the other constructor just specifying the number of columns and setting the numColumns parameter of the structure. In this version, only the three parameters of the table need to be set, they are:

  1. row height
  2. X coordinate
  3. Y coordinate

Now, we can specify the alignment of each text within a cell. If we have two columns, create an array of two Align elements.

After this much initialization, call the TextAndTable.AddRow() member. This can be called as many times as to add new rows. When finished, call EndTable(). This will return a string. This string should be passed to content.SetStream().

Now add these things to the file. Then we have finished our second step.


PageDict page=new PageDict();
ContentDict content=new ContentDict();


PageSize pSize=new PageSize(612,792);
pSize.SetMargins(10,10,10,10);
page.CreatePage(pageTreeDict.objectNum,pSize);
pageTreeDict.AddPage(page.objectNum);
page.AddResource(TimesRoman,content.objectNum);


TextAndTables textAndtable=new TextAndTables(pSize);


textAndtable.AddText(20,10,"Testing",10,"T1",Align.CenterAlign);




Align[] align=new Align[2];
align[0]=Align.LeftAlign;
align[1]=Align.LeftAlign;


ColorSpec cellColor=new ColorSpec(100,100,100);
ColorSpec lineColor=new ColorSpec(98,200,200);


TableParams table=new TableParams(2,200,200);
table.yPos=700;
table.xPos=100;
table.rowHeight=20;


textAndtable.SetParams(table,cellColor,Align.CenterAlign,3);
textAndtable.AddRow(false,10,"T1",align,"First Column","Second Column");
textAndtable.AddRow(false,10,"T1",align,"Second Row","Second Row");



content.SetStream(textAndtable.EndTable(lineColor));
content.SetStream(textAndtable.EndText());
size=0;
file=new FileStream(@"c:\text.pdf",FileMode.Append); 
file.Write(page.GetPageDict(file.Length,out size),0,size);
file.Write(content.GetContentDict(file.Length,out size),0,size);
file.Close();

Step Three

Now that we have finished the creation of the page, we can end the creation of the PDF document. This is done by writing every piece of information to the file.


file=new FileStream(@"c:\text.pdf",FileMode.Append);
file.Write(catalogDict.GetCatalogDict(pageTreeDict.objectNum, 
                                  file.Length,out size),0,size);
file.Write(pageTreeDict.GetPageTree(file.Length,out size),0,size);
file.Write(TimesRoman.GetFontDict(file.Length,out size),0,size);
file.Write(TimesItalic.GetFontDict(file.Length,out size),0,size);
file.Write(infoDict.GetInfoDict(file.Length,out size),0,size);
file.Write(pdfUtility.CreateXrefTable(file.Length,out size),0,size);
file.Write(pdfUtility.GetTrailer(catalogDict.objectNum,
                           infoDict.objectNum,out size),0,size);
file.Close();

Testing

All the code above is included inside a single function. Usually, for creating HTML files, the steps one and three will be done only once, but step two will be repeated many times. You can use this library and clarify any doubts as you go using this. Try experimenting with this.

Conclusion

This is a very basic library for creating PDF files. Once you know the PDF format, you can modify the library to include many more features like drawing lines and circles. Actually, the project I have been working only required simple tables to be added to the PDF files. That's is why I had to limit to only that feature.