亮度變化、灰度圖、對比度、高斯模糊。PDF文件是现阶段比較流行的電子文檔格式。截幾張圖來瞅瞅。

 

3C

5.有些消特別處理的地方

1.頁面跳轉。

假定直接运用Frame.Navigate,Frame.Back進行跳轉和归,你會發現,返回的時候,相當於重新Navigate了那個頁面。這個問題就比較惡心了,比如我現在滾動了滾動條,滾動到了大体上,點了千篇一律首文章,發現點錯了,點返回,你發現滾動條回到頂點位置了,而休是剛才本人滾動到一半之职位,於是我只好以滾動一所有,叫自己情何以堪。

 

自家之解決方案是,搞一個PageLoader,由其來處理頁面跳轉、返回的處理。每Navigate一個頁面,就格外成一個初的Frame,當返回時,刪除這個Frame就OK了,這樣,原來的Frame還在,神馬東東都保存著。。

具體代碼,請看我下篇博客吧。因為我覺得這玩意可能需要單獨的平等篇博客來進行說明。

 

2.AppBar

當Frame導向一個Page時,會把Page的AppBar導入進來,原來頁面的AppBar就不見了。

現在的問題是,當現在凡是发生AppBar的頁面時,如果加載一個沒有AppBar的東東,原來的Appbar不會消失。我覺得這應該是一個BUG。

于是,我只好放棄使用AppBar.

 

3.最後關於讀取程式內保存的文件、保存用戶配置、試用版的檢測等等,都用新博客來說明,我覺得這樣更好一些。

 

[END]

 

 

3.閱讀書籍

710官方网站 1

以GridView實現,豎排,元素豎排排列就得達到效果。

從右至错误,使用FlowDirection設置就可達到。

幾乎不用怎麼編寫代碼。

 

        private void gray_Click(object sender, RoutedEventArgs e)
        {
            Microsoft.Graphics.Canvas.Effects.GrayscaleEffect grayEffect = new Microsoft.Graphics.Canvas.Effects.GrayscaleEffect();
            grayEffect.Source = oriImage_;

            using (var ds = board_.CreateDrawingSession())
            {
                ds.Clear(Colors.Black);
                ds.DrawImage(grayEffect);
            }
            transform.Invalidate();
        }

header
example cell with colspan 1 and rowspan 2
1.1
2.1
1.2
2.2
cell test1
big cell
cell test2

特點是:繁體豎排,隱藏/顯示標點符號。

private void left_right_Click(object sender, RoutedEventArgs e)
{
    left_right_direction_ = -left_right_direction_;

    using (var ds = board_.CreateDrawingSession())
    {
        ds.Transform = Matrix3x2.CreateScale(new Vector2(left_right_direction_, top_bottom_direction_), new Vector2((float)oriImageRc_.Width / 2.0f, (float)oriImageRc_.Height / 2.0f));
        ds.Clear(Colors.Black);
        ds.DrawImage(oriImage_);
    }

    transform.Invalidate();
}

private void top_bottom_Click(object sender, RoutedEventArgs e)
{
    top_bottom_direction_ = -top_bottom_direction_;

    using (var ds = board_.CreateDrawingSession())
    {
        ds.Transform = Matrix3x2.CreateScale(new Vector2(left_right_direction_, top_bottom_direction_), new Vector2((float)oriImageRc_.Width / 2.0f, (float)oriImageRc_.Height / 2.0f));
        ds.Clear(Colors.Black);
        ds.DrawImage(oriImage_);
    }

    transform.Invalidate();
}

 

截幾張圖來瞅瞅。

        private void constrastSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
        {
            if (board_ == null) return;

            Microsoft.Graphics.Canvas.Effects.ContrastEffect constrastEffect = new Microsoft.Graphics.Canvas.Effects.ContrastEffect();
            constrastEffect.Contrast = (float)e.NewValue;
            constrastEffect.Source = oriImage_;

            using (var ds = board_.CreateDrawingSession())
            {
                ds.Clear(Colors.Black);
                ds.DrawImage(constrastEffect);
            }
            transform.Invalidate();
        }

C3

4.放大

 

710官方网站 2

推广縮小的作用,是动ViewBox實現的,又挺簡單了。

 

private void scale(float x)
{
    scale_ *= x;
    using (var ds = board_.CreateDrawingSession())
    {
        ds.Transform = Matrix3x2.CreateScale(scale_);
        ds.Clear(Colors.Black);
        ds.DrawImage(oriImage_);
    }

    transform.Invalidate();
}

private void zoomIn_Click(object sender, RoutedEventArgs e)
{
    scale(1.1f);
}

private void zoomOut_Click(object sender, RoutedEventArgs e)
{
    scale(1 / 1.1f);
}

 

曾经上架,下載地址:https://www.microsoft.com/store/apps/9nblggh6cc32

還是先來看下截圖:

7E

2.進入到“周文”

710官方网站 3

允許用戶添加筆記。使用ListView實現,也大簡單。

 

 

 

 

1.主界面

710官方网站 4

這張圖使用的凡GridView實現,其中ItemTemplate如下:

<GridView.ItemTemplate>
                <DataTemplate>
                    <Canvas  Width="96" Height="96" >
                        <Image Source="Assetsook.png"/>
                        <Border BorderBrush="White" BorderThickness="1,1,1,1" Canvas.Left="18" Canvas.Top="8">
                            <Border BorderBrush="Black" BorderThickness="1,1,1,1">
                                <Border BorderBrush="White" BorderThickness="1,1,1,1">
                                    <Grid Background="White">
                                        <TextBlock Text="{Binding Name}" TextWrapping="Wrap"  Width="16" FontSize="14" Foreground="Black" />
                                    </Grid>
                                </Border>
                            </Border>
                        </Border>
                    </Canvas>
                </DataTemplate>
            </GridView.ItemTemplate>

圖中的文字,使用Border進行邊框顯示,同時加一個Grid,白色背景,把TextBlock包裹起來。這樣,背景就能够根據文字的長度變化而變化了。

 

 

 

 

 

亮度、灰度、對比度、高斯,均用Effect效果,其功能在名字空間:

該圖片尺寸為8×8象素,每組一個字節,使用makeMask()方法可以轉換成遮罩。
byte maskr[] = {(byte)0x3c, (byte)0x7e, (byte)0xe7, (byte)0xc3,
(byte)0xc3, (byte)0xe7, (byte)0x7e, (byte)0x3c};
Image mask = Image.getInstance(8, 8, 1, 1, maskr);
mask.makeMask();
mask.setInvertMask(true);
我們可以用該遮罩直接挡住其它圖片的一律片。
PdfContentByte cb = writer.DirectContent;
Image image = Image.getInstance(“vonnegut.gif”);
image.ImageMask = mask;
或者我們將該遮罩用於模板遮罪中。
PdfContentByte cb = writer.DirectContent;
cb.setRGBColorFill(255, 0, 0);
cb.addImage(mask, mask.scaledWidth() * 8, 0, 0, mask.scaledHeight() *
8, 100, 400);
關於ContentByte對像更多信息請參見第十段。
圖片和其余對像
u 圖片在塊中
有時,可以方便地將圖片置於塊中,通過一定偏移將一個圖片置於塊中:
Chunk ck = new Chunk(img, 0, -5);
具體代碼見示例代碼0614,我們可以上加該特殊圖片塊到短句、表格等,本例中之圖片請到http://itextsharp.sourceforge.net/examples/pngnow.png下載。
u 圖片在表中
君得將圖片添加到單元格中,但生兩個副作用:
l 表格的寬度是確定,當圖片超出單元格的寬度時,將自動縮小。
l 你免能够進行文字繞排和為圖片添加下劃線。
參見示例代碼0615。
u 圖片鏈接註釋
只要您盼赢得一個只是點擊的圖片,或者想补偿加鏈接註釋到圖片上,你需要創建一個Annotation對象,並添加到圖片上,你莫需指定位置(你得使用0,0,0,0),該位置會內部更新为適合該圖片。
gif.Annotation = new Annotation(0, 0, 0, 0, “Chap1102b.pdf”, 3);
jpeg.Annotation = new Annotation(“picture”, “These are my children”, 0,
0, 0, 0);
參加示例代碼0616。
第二片 其他文檔格式
第七章 XML和 (X)HTML
本章主要介紹了什么使用iText控件生成XLM文檔和(X)HTML文檔,但我們對這些並不感谢興趣,故只介紹本章中涉及的將XML轉為PDF。
当第一段中,我們通過5步生產一個PDF文件,為了將一個XML文件轉換為PDF文件,只需要重新寫第3暨第4步,第5步由解析器自動處理。
//第3步:創建一個解析器並設置文檔句柄:
iTextHandler h = new iTextHandler(document);
//第4步,轉換該文檔:
h.Parse(“Chap0701.xml”);
演示代碼見示例代碼0702
第八章 RTF文件
RTF包
RTF包是基於iText包擴展出來的,允許iText除生成PDF文件外還可以輸出RTF文件,除了片每当RTF包着莫支持的特征外,大多數PDF文件特性都得使。
創建一個RTF文檔
創建一個RTF文檔和創建一個PDF文檔方法是一樣的,都是這基本的5步,唯一的區別是第2步着之所以RtfWriter代替了PdfWriter,見示例代碼0801。
第1步 創建一個the iTextSharp.text.Document對象的實例:
Document document = new Document();
第2步 創建一個document的RtfWriter將document寫入你選擇的輸出流:
RtfWriter.getInstance(document, new FileStream(“Chap0801.rtf”),
FileMode.Create);
第3步 打開document:
document.Open();
第4步 添加內容到document
document.Add(new Paragraph(“Hello World”));
第5步 關閉document
document.Close();
關於如何創建其他對象並添加到document中,請參見其他章節的內容。
无支持的特征
水印
閱讀器參數
加密
內嵌字體
塊間距
段右縮排
列表右縮排
無圓點符號列表
嵌套表格
除JPEG和PNG的另圖片
RTF中擴展的頁眉和頁腳
寫入RTF時無法在開始新頁前通過setHeader方法改變文檔的頁眉或頁腳,這裡有兩個辦法來解決這個問題。
以「Chapters」,添加一個新「chapter」到文檔前,使用setHeader或setFooter,你可以于不同的「Chapters」中动用不同的頁眉或頁腳,見示例代碼0802。
应用RtfHeaderFooters類。該類允許你設置4個頁眉或頁腳,並指定在哪頁出現。你當然可以結合Chapter創建4個不同之頁眉或頁腳,見示例代碼0803。
u 使用RtfHeaderFooters類
第1步創建一個RtfHeaderFooters類:
RtfHeaderFooters headers = new RtfHeaderFooters();
第2步添加HeaderFooter對像
headers.Add(RtfHeaderFooters.LEFT_PAGES, new HeaderFooter(new
Phrase(“This header is only on left hand pages”)));
headers.Add(RtfHeaderFooters.RIGHT_PAGES, new HeaderFooter(new
Phrase(“This header is only on right hand pages”)));
第3步如同用頁眉頁腳一樣使用RtfHeaderFooters
document.Header = headers;
使用RtfHeaderFooters.add(…)的常量:
FIRST_PAGE:
在您文檔的第一頁使用該頁眉或頁腳。你將使rtfWriter.HasTitlePage =
true來完成
LEFT_PAGES: 所有左邊頁均使用該頁眉或頁腳
RIGHT_PAGES: 所有右邊頁均使用該頁眉或頁腳
ALL_PAGES: 所有頁均使用該頁眉或頁腳,只有同FIRST_PAGE
結合使用才有意義。
来一致宗事好重要:如果你采取LEFT_PAGES或者RIGHT_PAGES來設置頁眉或頁腳,再下ALL_PAGES,頁眉和頁腳均无會起作用。
表效果見示例代碼0804。
其三有些 iText的高級應用
第九章 字體
本章原文講了許多字體的动技术,但就沒有講如何采取中文,因此,意義不要命,再說,如果不支持中文,前面的呢就是白翻譯了,因此,根據原文講到的片知識,我寻找出漢字的采用办法,自己寫了本章內容,應該算是「原創」了吧^_^(哎呀!誰拿雞蛋扔我……)。
Windows中一般还是采用TrueType字體,每個中文版Windows操作系統均默認安裝了細明體、仿宋、黑體和楷體四種字體,你還可以安裝其他第三正在字體,如安裝了Office
2000後,會自動安裝華文行楷等字體,比較奇怪的是,在PDF文件被插入了一如既往種本計算機才有的字體,在打開PDF文件的計算機上雖然沒有該字體,但依旧会健康顯示!這有別於Word文件,Word文件將當前計算機中沒有的字體一律用細明體代替,這大概是竟然收穫吧。
字體文件一般保存于windir\Fonts目錄中,擴展名為TTF,還有擴展名為TTC的字體文件,也是TrueType字體,不過是一個集合,也就算是裡面有多種字體。下面列有windows2000簡體中文版四種標準字體的文本名稱:
SIMSUN.TTC:細明體和初細明體
SIMKAI.TTF:楷體
SIMHEI.TTF:黑體
SIMFANG.TTF:仿細明體
TrueType字體應用
遵循下的主意寫入黑體字文字,大小為32磅:
BaseFont bfHei = BaseFont.createFont(@”c:\winnt\fonts\SIMHEI.TTF”,
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font font = new Font(bfHei, 32);
String text = “這是黑體字測試!”;
document.Add(new Paragraph(text, font));
并非管BaseFont.createFont方法第二、三個參數的意思,依葫蘆畫瓢就实行了,第一個參數顯示就是字體文件存放的位置。
後面的代碼都蛮好理解,不再贅述。
TruType字體集合的應用
字體集合的利用和地方差不多,只是于当createFont方中要指定使用啊種字體。如:
BaseFont bfSun=BaseFont.createFont(@”c:\winnt\fonts\SIMSUN.TTC,1″,
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
font = new Font(bfSun, 16);
text = “這是字體集合中的新細明體測試!”;
document.Add(new Paragraph(text, font));
不難看有,在利用BaseFont.createFont方法時,第一個參數@”c:\winnt\fonts\SIMSUN.TTC,1″中几近了一個「,1」,表示以序號為1字體,序號為0的字體為細明體。
畢竟我們不是召开排版軟件,有矣地方的辦法就基本上夠用了,真正好複雜的PDF文件製作,不妨做成XML文件(最簡單的辦法就是因此Word排版,然後另存為web頁了),然後按第七段的辦法轉換。
代碼見示例代碼0901。
第十回 圖像和文件的絕對位置
pdfContentByte
到目前為止,我們已經使用了簡單的iText,我們已經添加了文件、圖片、段落、章節、列表、表格等,沒有涉及到佈局問題。Itext分割文本及每頁中,並將每個單詞、句子、段落佈置到頁面上,但有時我們並不欲這種自動格式,有時我們希望將一些圖像或者文本放置于某頁的指定位置,為實現該功能,我們將使PdfContentByte類。
為代替第一回,僅用PdfWriter類的getInstance方法是不夠的,你必須真實地擁有一個PdfWriter對象,你可通過在用Writer對像挨采取getDirectContent()方來得到該對象。例:
PdfWriter writer = PdfWriter.getInstance(document, new
FileOutputStream(“test.pdf”));
PdfContentByte cb = writer.DirectContent;
說明:當你长高級對像(如表格)時,兩個PdfContentByte對像將被內部使用:一個用於文本,一個所以用於圖像(如邊界或單元格背景)。文本繪製浮於圖像的点。
當你通過getDirectContent()方法直接行使PdfContentByte對像時,你所添加的有所對象都將浮於文本以及圖像。如果您想避免這種情況和希望增长內容在圖像或文本的背後,你得利用用getDirectContentUnder()方。
如出一辙词話,當一頁完成時,4層的重疊遵照如下順序:
1、 通過getDirectContentUnder()得到的PdfContentByte
2、 包含圖像或高級對象的內部PdfContentByte
3、 病文本或高級對象的內部PdfContentByte
4、 通過getDirectContent()得到的PdfContentByte
簡單圖形
于演示代碼1001受到,繪製了有些簡單圖形,我們使用了諸如moveTo和lineTo方法來在移動到頁面上當前位置然後畫一條直線到其他位置。我們使用了諸如setLineWidth和setLineDash方法來改變直線的外觀,如:
cb.LineWidth = 10f;
cb.moveTo(100, 700);
cb.lineTo(200, 800);
cb.stroke();
說明:當你改變諸如顏色、線寬等屬性時,只有你以調用stroke方法時才于作用。在例中繪製三角形時,我們設置顏色為綠色,在运用stroke方法前我們改變顏色為紅色,則繪製三角形的結果為為紅色而休是綠色,該例中還有矩形、圓等采用办法。
文本
當你想將文本寫入ContentByte中時,你必須使用方式beginText()和endText,你啊必須設置字體和尺寸。就如圖形示例中一樣,還有許多艺术用於寫入和放文本,但若尽急需的凡方法showTextAligned和方showText配合setTextMatrix。
例1:
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252,
BaseFont.NOT_EMBEDDED); cb.beginText();
cb.setFontAndSize(bf, 12);
cb.showTextAligned(PdfContentByte.ALIGN_CENTER, text + “This text is
centered”, 250, 700, 0);
cb.endText();
例2:
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252,
BaseFont.NOT_EMBEDDED);
cb.beginText();
cb.setFontAndSize(bf, 12);
cb.setTextMatrix(100, 400);
cb.showText(“Text at position 100,400.”);
cb.endText();
請參見示例代碼1002。
模板(Form xObjects)
當我們在第四回討論頁眉和頁腳時,我們定義了平等小塊添加至每一样頁的消息,實際上,該小塊信息寫到了文本之各国一個新頁上。這並不是极端經濟的解決方案,更好之辦法是將該信息作為一個Form
Xobject僅在文檔中上加同次,在其可見位置重複出現。我達到該目的,我們將使模板。
u 創建一個PdfTemplate
u
創建PdfTemplate的顶好方式是調用PdfContentByte對像被的createTemplate方法:
PdfContentByte-object:
PdfTemplate template = cb.createTemplate(500, 200);
這樣,該模板的寬度為500,高度為200。
通過該模板我們可以做象PdfContentByte同樣的业务
template.moveTo(0, 200);
template.lineTo(500, 0);
template.stroke();
template.beginText();
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252,
BaseFont.NOT_EMBEDDED);
template.setFontAndSize(bf, 12);
template.setTextMatrix(100, 100);
template.showText(“Text at the position 100,100 (relative to the
template!)”);
template.endText();
u 添加一個模板到文檔
通過象下一樣在絕對位置添加一個模板:
cb.addTemplate(template, 0, 400);
您還可以开片好玩的工作,如縮放或旋轉他們:
//將模板旋轉90渡过
cb.addTemplate(template, 0, 1, -1, 0, 500, 200);
// 縮放模板為50%
cb.addTemplate(template, .5f, 0, 0, .5f, 100, 400);
//縮放模板為200%
cb.addTemplate(template, 2, 0, 0, 2, -200, 400);
具體演示見示例代碼1003。
u 第幾頁共幾頁
在局部情況下,你盼插入一些您当寫本頁時外殼無法知道的消息及文本中错过,如:在相同首文檔的率先頁,你並不明白該文檔共有幾頁。只能于成就了整個文檔時才知總的頁數。當使用模板時,該問題就未存了。在示范代碼0103中,我們在抬高模板到ContentByte前上加了一些音讯到模板被,這是沒有必要之。我們可以在其他時候添加信息到模板,因為iText添加Form
Xobject是于PDF結束的地方(當通過close方法關閉該文檔時調用)。示例代碼1004顯示了第一創建4頁然後添加總到頁數,該例非常簡單和实用。
分欄
以本章以前,你已經掌握了什么样將文本放在一個絕對位置,這種情況下,我們要確定文本的開始坐標。如果我們想明白文书的結束位置,我們得做一些計算工作。
現在我們要加有文书及一個矩形框的內部,希望文本到達右邊界時自動換行。超出矩形部分將不顯示,可以通過ColumnText類實現。
舉個例子:
為顯示一個点名的缺乏句以坐標(100, 300)和(200,
500)間的矩形內居中,我們使用下的代碼:
PdfContentByte cb = writer.DirectContent;
ColumnText ct = new ColumnText(cb);
ct.setSimpleColumn(phrase, 60, 300, 100, 500, 15,
Element.ALIGN_CENTER);
ct.go();
通過查看示例代碼1005,你會立即發現通過該方法可以可以畫一些複雜的表而無須Table對象。
另外一個例:
沒有必要一次性將文本全部加上進去,你得预先定義一個矩形,然後添加有文本,最後用go方法顯示分欄。
PdfContentByte cb = writer.DirectContent;
ColumnText ct = new ColumnText(cb);
ct.setSim7pleColumn(60, 300, 100, 500, 15, Element.ALIGN_CENTER);
ct.addText(phrase1);
ct.addText(phrase2);
ct.addText(phrase3);
ct.go();
詳見示例代碼1006。
多欄
當然,如果文本超出了矩形範圍,我們並不思丟失這些多来之文本,或許我們想將這些文本顯示到另外欄中。這就是為什麼我們要查阅go方法返回值的故。如果回到標識為「NO_MORE_COLUMN」,表示該欄中沒有足夠的空間存放該文本,如果所有的文件均顯示出來,標識將為「NO_MORE_TEXT」。
請參見示例代碼1007。
不規則欄
定義一個非矩形的區域來顯示欄也是可能的,通過使用setColumns方法,我們為文本定義了一個左右邊界。
float[] left = {70,790, 70,60};
float[] right = {300,790, 300,700, 240,700, 240,590, 300,590, 300,106,
270,60};
ct.setColumns(left, right);
张冠李戴邊界是相同條直線,而右边邊界是不規則的。該函數的結果可以導致一些格外有意思的佈局,見示例代碼1008,本例中若將使一個誉为為caesar_coin.jpg的圖片:

亮度,注意,我下了WhitePoint,還有BlackPoint,請讀者自己試驗效果。而且亮度的範圍為:[0-1),注意閉包關係。

7E

private void gaussianSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
        {
            if (board_ == null) return;

            Microsoft.Graphics.Canvas.Effects.GaussianBlurEffect gaussianEffect = new Microsoft.Graphics.Canvas.Effects.GaussianBlurEffect();
            gaussianEffect.BlurAmount = (float)e.NewValue;
            gaussianEffect.Source = oriImage_;

            using (var ds = board_.CreateDrawingSession())
            {
                ds.Clear(Colors.Black);
                ds.DrawImage(gaussianEffect);
            }
            transform.Invalidate();
        }

 

具體代碼:

E7

 

 

旋轉代碼(注意,默認轉動方向是鐘錶方向——順時針):

 

private void rotate_Click(object sender, RoutedEventArgs e)
{
    rotate_radians_ += 90;
    using (var ds = board_.CreateDrawingSession())
    {
        ds.Transform = Matrix3x2.CreateRotation(rotate_radians_ * (float)Math.PI / 180, new Vector2((float)oriImageRc_.Width / 2.0f, (float)oriImageRc_.Height / 2.0f));
        ds.Clear(Colors.Black);
        ds.DrawImage(oriImage_);
    }

    transform.Invalidate();
}

 

實現了幾個效果:放大、縮小、旋轉、左右翻轉、上下翻轉,亮度變化、灰度圖、對比度、高斯模糊。

打開document前使开的行:
君只能在Open方法調用之前增长摘要,這是iText開發工具提供的一個選擇。
在HTML中,報頭信息被在文檔前面報頭標識中間,調用Open方法將導致報頭信息寫入流,因而在Document被打開後無法更改這些數據。
PDF報頭信息不包括摘要,看起來有類似於:
%PDF-1.2
該行顯示生成的文檔是一個版本為1.2之PDF格式的文书,在PDF中,摘要保存在PdfInfo對像受,當文檔關閉時已經寫入PdfWriter中了,因此,沒有關於為什麼不可知修改庫來滿足任何時候添加或转移摘要的技術原因
u 頁面初始化
Open方法在不同之Witer中同時會產生初始化事件,舉例來說,如果你得一個水印或者頁眉頁角對像出現在文檔第一頁的開始處,你需要在打開文檔前添加這些,同樣的用於設置該文檔其他頁水印、頁眉、頁角、頁數和尺寸。
當調用下列方法:
public bool setPageSize(Rectangle pageSize)
public bool Add(Watermark watermark)
public void removeWatermark()
setting Header property
public void resetHeader()
setting Footer property
public void resetFooter()
public void resetPageCount()
setting PageCount property
產生的結果只能于产一個新頁中来看(當在本頁調用初始化方法時),代碼見示例代碼0107,你必須要準備一張名為watermark.jpg的圖片,如下圖:

源碼下載:http://yunpan.cn/c3iNuHFFAcr8h  访问密码
8e48

 

高斯:

 

 

 

横、上下翻轉代碼:

 

private void lightSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
        {
            if (board_ == null) return;

            using (var ds = board_.CreateDrawingSession())
            {
                Microsoft.Graphics.Canvas.Effects.BrightnessEffect brightness = new Microsoft.Graphics.Canvas.Effects.BrightnessEffect();
                if (e.NewValue >= 0.000001)
                {
                    brightness.WhitePoint = new Vector2(0, (float)e.NewValue);
                }
                else
                {
                    brightness.WhitePoint = new Vector2(-(float)e.NewValue, 0);
                }

                brightness.Source = oriImage_;

                ds.Clear(Colors.Black);
                ds.DrawImage(brightness);
            }

            transform.Invalidate();
        }

E7

 

 

710官方网站 5

4、 在代碼窗口頂部添加兩個引用:
using iTextSharp.text;
using iTextSharp.text.pdf;
由来,準備工作完畢。

 

 

對比度:

 

 

PDF文件是现阶段比較流行的電子文檔格式,在辦公自動化(OA)等軟件的開發中,經常要为此到該格式,但介紹如何製作PDF格式文件的資料非常少,在網上搜來搜去,都轉貼的凡一样段「暴力」破解的法子,代碼片斷如下:
StreamWriter pPDF=new StreamWriter(filePath);
ArrayList xRefs=new ArrayList();
float yPos =0f;
long streamStart=0;
long streamEnd=0;
long streamLen =0;
string strPDFMessage=null;
//PDF文檔頭信息
strPDFMessage=”%PDF-1.1\n”;
ConvertToByteAndAddtoStream(strPDFMessage);

灰度:

  1. table.Cellspacing = 5;
    Cell cell = new Cell(“header”);
    cell.Header = true;
    cell.Colspan = 3;
    table.addCell(cell);
  2. cell = new Cell(“example cell with colspan 1 and rowspan 2”);
    cell.Rowspan = 2;
    cell.BorderColor = new Color(255, 0, 0);
    table.addCell(cell);
    table.addCell(“1.1”);
  3. table.addCell(“2.1”);
    table.addCell(“1.2”);
    table.addCell(“2.2”);
    table.addCell(“cell test1”);
    cell = new Cell(“big cell”);
  4. cell.Rowspan = 2;
    cell.Colspan = 2;
    cell.BackgroundColor = new Color(0xC0, 0xC0, 0xC0);
    table.addCell(cell);
    table.addCell(“cell test2”);
  5. document.Add(table);
Microsoft.Graphics.Canvas.Effects

 

放开、縮小代碼:

 

顏色(SpotColors)和圖案(Patterns)
顏色(spotcolors)的用見示例代碼1013,示例代碼1014与演示代碼1015演示了圖案(patterns)的使方法。
第十一节 本地及異地轉向、目標和大意
地方轉向
有時你需要一個允許讀者從文檔的一個地方跳轉到另外一個地方的鏈接,你可以通過類Chunk的setLocalGoto
和setLocalDestination兩個方法實現,例:
Chunk localgoto = new Chunk(“this word”,
FontFactory.getFont(FontFactory.HELVETICA, 12, Font.NORMAL, new Color(0,
0, 255))).setLocalGoto(“test”);
Chunk destination = new Chunk(“local destination”,
FontFactory.getFont(FontFactory.HELVETICA, 12, Font.NORMAL, new Color(0,
255, 0))).setLocalDestination(“test”);
見示例代碼1101。
異地轉向
于第3节中,我們演示了一個錨點如何轉向到外URL,一個錨點通過不同的字體、風格和顏色,可以分包不同的Chunks,在iText的高級應用中,下面定義鏈接到URL的其它措施:
Chunk chunk = new Chunk(“anchor”,
FontFactory.getFont(FontFactory.HELVETICA, 12)).setAnchor(new
URL(“http://www.lowagie.com/iText/”));
u 轉到PDF文檔中的指定位置
如果您于文檔中指定了一個目的地,你可從另外一個文檔跳轉到這裡,為實現該功能,你可以采用办法:
setRemoteGoto: Chunk chunk = new Chunk(“jump”,
FontFactory.getFont(FontFactory.HELVETICA, 12,
Font.ITALIC)).setRemoteGoto(“test.pdf”, “test”));
test.pdf是另外一個pdf文件,」test」是該文件的一個目的地。
跨越轉到其它一個PDF文件指定頁
以方法setRemoteGoto,用頁碼參數代替名稱參數,可以非常容易地过轉定另外一個文檔的指定頁:
chunk = new Chunk(“jump”, FontFactory.getFont(FontFactory.HELVETICA, 12,
Font.ITALIC)).setRemoteGoto(“test.pdf”, 3));
見示例代碼1102
u 啟動一個應用程序
得应用下的方啟動一個應用程序:
public PdfAction(String application, String parameters, String
operation, String defaultDir)
如application為「c:/winnt/notepad.exe」(其餘參數可以為null),你得通過PDF文件中之鏈接來啟動記事本程序。
u 文件和URL
苟您想过轉到外文檔或URL,你待通過下面的構造函數之一創建一個:
PdfAction(String filename, String name);
PdfAction(String filename, int page);
PdfAction(URL url);
PdfAction(String url);
前面兩個構造函數允許你过轉到文件的指定位置或頁碼,後兩個構造函數允許你跨轉到任何URL上。
其餘部分稍微。
第十二章 頁面和表格事件
略。

 

 

u 閱讀器參數:
乃可通過下面的辦法為PDF文件指定一些閱讀器 (如Adobe Reader) 參數:
public void setViewerPreferences(int preferences)
于示范代碼0108中,指定了下面有參數:
writerA.setViewerPreferences(PdfWriter.PageLayoutTwoColumnLeft);
writerB.setViewerPreferences(PdfWriter.HideMenubar |
PdfWriter.HideToolbar);
writerC.setViewerPreferences(PdfWriter.PageLayoutTwoColumnLeft |
PdfWriter.PageModeFullScreen |
PdfWriter.NonFullScreenPageModeUseThumbs);
刚刚而你所见到底,參數可以采取以下一些常量:
l 文件为打開時,頁面佈局用到下面的内部一個 :
PdfWriter.PageLayoutSinglePage – 同時只顯示一個頁面
PdfWriter.PageLayoutOneColumn –單列顯示
PdfWriter.PageLayoutTwoColumnLeft –雙列顯示,奇數頁在错
PdfWriter.PageLayoutTwoColumnRight -雙列顯示,奇數頁在右边
l 文件打開時,頁面模式下下面其中有:
PdfWriter.PageModeUseNone – 既不顯示大鋼也非顯示縮略圖
PdfWriter.PageModeUseOutlines – 顯示大綱
PdfWriter.PageModeUseThumbs – 顯示縮略圖
PdfWriter.PageModeFullScreen –
全屏模式,沒有菜單、windows控件或者其它任何windows可見控件
l PdfWriter.HideToolbar – 當文檔激活時,是否隱藏閱讀程序(如Adobe
Reader)的工具條
l PdfWriter.HideMenubar -當文檔激活時,是否隱藏閱讀程序的菜肴單.
l PdfWriter.HideWindowUI
-當文檔激活時,是否隱藏閱讀程序的界面元素,如滾動條、導航條等,而僅僅保留文檔顯示
l PdfWriter.FitWindow – 是否調整文檔窗口尺寸为適合顯示第一頁。
l PdfWriter.CenterWindow – 是否將文檔窗口放到屏幕中央
l 以全屏模式下,指定如何顯示界面元素(選擇一個)
PdfWriter.NonFullScreenPageModeUseNone -既非顯示大鋼也非顯示縮略圖
PdfWriter.NonFullScreenPageModeUseOutlines – 顯示大鋼
PdfWriter.NonFullScreenPageModeUseThumbs – 顯示縮略圖
說明:你不得不在類PdfWriter中調用這些方法。
u 加密
打開文檔之前還要做的平码业务就是加密(如果您希望該文檔加密),要達到這個目的,你可以使下的点子:
public void setEncryption(boolean strength, String userPassword, String
ownerPassword, int permissions);
strength 是脚兩個常量之一:
PdfWriter.STRENGTH40BITS: 40 位
PdfWriter.STRENGTH128BITS: 128员 (Acrobat Reader 5.0与以上版本支持)
UserPassword和ownerPassword 可以為空或零長度, 這種情況下,
ownerPassword 將被隨機的字符串代替
Permissions 為下列常量之一:
PdfWriter.AllowPrinting
PdfWriter.AllowModifyContents
PdfWriter.AllowCopy
PdfWriter.AllowModifyAnnotations
PdfWriter.AllowFillIn
PdfWriter.AllowScreenReaders
PdfWriter.AllowAssembly
PdfWriter.AllowDegradedPrinting
該功能參見示例代碼0109和示范代碼0110。
writer.setEncryption(PdfWriter.STRENGTH40BITS, null, null,
PdfWriter.AllowCopy);
以身作则代碼0109產生的文件能夠被打開而無須密碼,但用戶不能够打印、修改以文檔。
writer.setEncryption(PdfWriter.STRENGTH128BITS, “userpass”, “ownerpass”,
PdfWriter.AllowCopy | PdfWriter.AllowPrinting);
于而試圖打開示例代碼0110產生的文件時,將要求輸入密碼(’userpass’),因為添加了AllowPrinting參數,你可打印該文檔而非會發生任何問題。
季步 添加內容
每当解釋第一步到第三步之不同示例中,你或许已經遇到了有的對像要Phrase,
Paragraph等 在接入下來的幾段中,所有這些問題都將得到詳細解釋。
有時你也许想一個writer故意忽视document產生的行為,如示例代碼0111:
當我們創建了兩個writer: writerA 和 writerB:
PdfWriter writerA = PdfWriter.getInstance(document, new
FileStream(“Chap0111a.pdf”, FileMode.Create));
PdfWriter writerB = PdfWriter.getInstance(document, new
FileStream(“Chap0111b.pdf”, FileMode.Create));
我們可以創建兩個有細微差別的文檔:
writerA.Pause();
document.add(new Paragraph(“This paragraph will only be added to
Chap0111b.pdf, not to Chap0111a.pdf”));
writerA.resume();
乃可以比較文件: Chap0111a.pdf和Chap0111b.pdf的區別
第五步,關閉 document
關閉 document 非常重要,
因為它將關閉正在運行的Writer並將內容寫入文件,該方法在最後被調用,你應該總是要關閉文檔。
高級話題:閱讀PDF文件
該部分內容介紹了iText只能產生PDF格式的文本要休可知分析PDF格式文件,不再翻譯。
亚章 塊、短句和段落

塊(Chunk)是能够吃补加至文檔的文书的卓绝小單位,塊可以用於構建其他基礎元素而短句、段落、錨點等,塊是一個发出確定字體的字符串,要补加塊到文檔中時,其他有佈局變量均要给定義。下面一行中,我們創建了一個內容為「hello
World」、紅色、斜體、COURIER字體、尺寸20之一個塊:
Chunk chunk = new Chunk(“Hello world”,
FontFactory.getFont(FontFactory.COURIER, 20, Font.ITALIC, new Color(255,
0, 0)));
u 典型字體1:
于本指南中,除了第九章他(你可在這裡學會使用另外字體),我們將始終使用典型字體1,這些是见仁见智的卓越字體1:
· Courier (該字體定寬)
· Helvetica
· Times Roman
· Symbol
· ZapfDingbats

u 表格分割
设若一個表格不可知在同等頁中,將自動被分,示例代碼0508顯示了當一個表到達頁邊時發生的情況,這將在生一样節中解釋。
大表格
逾幾頁的报表將自動被分割成不同之有些。示例代碼0509顯示了一個超过多頁的報表。該報表有一個表頭,如果您愿意這個表頭在各级頁都出現,你可以用endHeaders()方法標記表頭區域的結束點,見示例代碼0510。
為做這樣的報表,建議設置單元格間距為0和僅使用指定的填距。
你恐怕已經注意到了,當一個表格让划分時,一些邊界好像丟失了。這是因為單元格在头里一样頁被完全地繪製了如果未會傳遞給下一样頁。
u 強行將一個报表或單元格佈置到同頁上
发生小情況下,你恐怕要避免單元格或者整個表被拆分成兩個部分,示例代碼0511差不多和示范代碼0508完全一樣,但我們設置了參數TableHasToFit為true,看看示例代碼0508和示范代碼0511結果區別。在演示代碼0512中我們修改了示范代碼0510的CellsHaveToFit屬性為true,比較兩個示例產生結果的區別。
內存管理
當我們添加一個對像到文檔時,該對像相同出或就寫入了輸出流,但當創建一個表格時,該Table對像一直保存著,對於真正的深表,這將成為一個問題。
同樣,當你碰巧寫一個HttpServletResponse對像及輸出流時,瀏覽器也可能超時。這就是為什麼你协调用fitsPage()方法控制表分割是行之,示例代碼0513告訴你怎样做。
嵌套表格
发生兩種方法嵌套表格,第一種是行使insertTable方法明確地將一個报表插入到另外一個表,示例代碼0514顯示了通過插入到任何表格的辦法創建的5個表格。正使您见到的在前方兩個表中,所有空的單元格自動得到分割,因為改變了原來的报表。如果一個單元格不空,列跨度和(或)行跨度將自動調整到新的职位,頁面上第三個表格顯示所有原表中列的相關寬度都赢得了保護,第四個表格顯示我們可以在插入了报表後添加其余單元格:該單元格自由地增长到下一個單元格中。最後是一個深嵌套的报表。
當你用insertTable方法時,插入表的寬度百分比不會被考慮,如果您愿意插入表僅佔單元格的80%(這是默認的寬度百分比),你不得不以單元格中繞排,見示例代碼0515,這也是讓一個阐明結合其他數據存放于跟一個單元格中之唯一辦法,見示例代碼0516。
備註:你不得不將一個表格插入到列跨度和行跨度均為1底單元格中。
报表偏移
當一個表让上加至文檔之前,以當前間距為準的新行將被添加(如前方一個栽對象的間距)。有時因為前一個插入對像和當前表格間的間距過大还是過小若並不愿意這樣做,如果你想改變這個空間,你不得不設置表格偏移,如示例代碼0517。
表的絕對位置
iTextSharp.text.Table是一個通過標準方法創建表格的相當簡單的類,但有時你愿意表格来一部分独特的行為,這種情況下您將使重复複雜的類com.lowagie.text.pdf.PdfPTable,示例代碼0518是一個异常簡單的事例,在第十段以及十二章节中將有有重新複雜的例证。
第六章 圖片
Image對像
倘若您學習過API,你可能已經注意到可以通過幾種構造函數來創建圖片,本手冊中,我們將僅僅告訴你顶簡單的解決方案,如訪問通過文件称或URL確定的圖片生成的Image對象。
public static Image getInstance(Uri url)
public static Image getInstance(string filename)
Image是一個抽像類,故获實例的法子將判斷給出之圖片的類別(GIF、Jpeg、PNG……)並返回對象的類別Gif、Jpeg、Png……,一些圖片會被忽略,如果你想掌握哪些圖片會被忽略,請查閱FAQ(http://www.lowagie.com/iText/faq.html\#images)。
u 通過URL得到圖片實例
這是加上一個圖片最簡單的辦法,見示例代碼0601,我們添加了一個WMF、一個Gif、一個Jpeg和一個PNG圖片到文檔中,使用4個URL得到:
Image wmf = Image.getInstance(new URL(“../examples/harbour.wmf”));
Image gif = Image.getInstance(new URL(“../examples/vonnegut.gif”));
Image jpeg = Image.getInstance(new URL(“../examples/myKids.jpg”));
Image png = Image.getInstance(new URL(“../examples/hitchcock.png”));
備註:許多PDF庫在插入一個圖片前都將其消除壓縮並轉換成位圖格式,下面是幾個我為什麼不這樣做的由:
這將導致PDF文件增大,這樣產生的PDF文件尺寸是见仁见智圖片文件尺寸總和的數十倍增。
面臨一個王法問題:LZW算法受專利保護,所以不允許使用這種算法來解壓縮GIF等文件。
u 通過文件称博圖片實例
通過簡單地改變圖片引用路徑將示例代碼0601改成示例代碼0602:
Image gif = Image.getInstance(“vonnegut.gif”);
Image jpeg = Image.getInstance(“myKids.jpg”);
Image png = Image.getInstance(“hitchcock.png”);
同示例代碼0601的區別只是該圖像從本地獲取而已,另外一個例見示例代碼0603。
圖片的岗位
u 對齊方式
通過下面方法設置圖片的對齊方式:
Alignment = Image.RIGHT
Alignment = Image.MIDDLE
Alignment = Image.LEFT
參見示例代碼0604。
我們將Vonnegut的圖片放在右邊,小孩的圖片放在中間,hitchcock的圖片放在左邊。
u 圖片和文件
除此以外,你還可以指定文本相對圖片的環繞方式:
Alignment = Image.RIGHT | Image.TEXTWRAP
Alignment = Image.MIDDLE
Alignment = Image.LEFT | Image.UNDERLYING
見示例代碼0506,文字在Vonnegut圖片的左側,並不在我孩子家的圖處環繞,且排在Hitchcock圖片的端。
說明:該功能还有一些BUG。
u 絕對位置
當製作PDF文件時,你恐怕为此到該方法:
public void setAbsolutePosition(int absoluteX, int absoluteY)
將一個圖片放要頁面上一個絕對位置的代碼見示例代碼0606,我們在不同之坐標處添加了兩帧圖片,這裡使用給定的坐標將圖片放在了左下角,通過將圖片的寬度和惊人作為X和Y坐標將設置第一個圖片,坐標的2倍設置第二個圖片。
縮放和旋轉圖片
u 縮放
来幾種辦法可以縮放圖片:
public void scaleAbsolute(int newWidth, int newHeight)
public void scalePercent(int percent)
public void scalePercent(int percentX, int percentY)
public void scaleToFit(int fitWidth, int fitHeight)
童的圖片大小為194×202象素,如果你想讓圖片小片段,你可通過scaleAbsolute(97,
101)進行縮放,使用scalePercent(50)也会到達同樣的功力。
還可以通過scaleAbsolute(194,
101)來減小,所以這些例子都坐落了示范代碼0607中。
u 對分辨率的影響
倘若一個圖片不經任何縮放,其分辨率(resolution)為72,如果該圖片縮放比例為50%,則分辨率為144,如果起重复小的縮放比,則分辨率將更可怜,因為象素相同只是尺寸變得重复粗了。使用72/300=24%之比例放置一個300dpi的圖片,例:你用300dpi掃瞄了一個5×5英吋的圖片,圖片結果為1500×1500象素(5×300),當你用24%(72/300=0.24)的百分比將該圖片放置到PDF文件中時,PDF中的圖片將為5×5英吋1500X1500象素300dpi,該圖片將始終為1500X1500象素而不管尺寸如何。
u 旋轉
足通過下面的计旋轉圖片
public void setRotation(double r)
詳見示例代碼0608。
初圖片數據
顶即為止,所有例子中采取的圖片均來自地地方磁盤或者某個網站,但为或以含圖片信息之數組來得到圖片的實例:
public static Image getInstance(byte[] img)
該方法以及前方法的效能同样,返回一個新的Gif,Jpeg或者Png類別的Image對象。
当示范代碼0609中,我們添加一個從一個Jpeg文件中讀入到字節數組中之圖片,很明顯,使用其他getInstance方法获得實例更優越,但這僅僅是一個例证,該getInstance方法在動態創建那些根本无存的圖片時非常实用。
該例子吗演示了哪創建和使用一個老圖片。
public static Image getInstance(int width, int height, int components,
int bpc, byte data[])
本例中創建了一個100×100模样素的圖片,因為每個像素用RGB描述,所以圖片大小為100×100×3字節。
System.Drawing.Bitmap
演示代碼0610凡是一個比較高級的話題,理由如下:
首次等用到了System.Drawing.Bitmap類。該類在.net框架中,可以利用重复多類型的圖片,如TIFF、GIF,而這些圖片在iText中皆无支持,你得檢查一下.net框架看您待之圖片格式是否取得支持。
眼前的事例中,還有一些事情若专注:當添加一個圖片時不會出現什麼問題,文字始終浮於圖片上面,本例中,我們希望圖片浮在文方面。這也是為什麼我們將使iTextSharp.text.pdf.PdfContentByte類的由(見第十段)。
你將發現使用的圖片為透明的gif格式,你可交http://itextsharp.sourceforge.net/examples/h.gif下載得到。
TIFF和CCITT
示范代碼0611吗是一個比較高級的話題,例中轉換一個TIFF文件到PDF文件。
u 圖片遮罩
示范代碼0613在,我們創建了一個作为遮罩的圖片

 

3C

先是有 iText的簡單應用
首先段 創建一個Document
运iText五步創建一個PDF文件:helloword。
第一步,創建一個 iTextSharp.text.Document對象的實例:
Document document = new Document();
其次步,為該Document創建一個Writer實例:
PdfWriter.getInstance(document, new FileStream(“Chap0101.pdf”,
FileMode.Create));
其三步,打開當前Document
document.Open();
季步,為當前Document添加內容:
document.Add(new Paragraph(“Hello World”));
第五步,關閉Document
document.Close();
整的代碼見示例代碼0101。
于例中,不難看有,製作一個PDF文件是十分簡單的。
註:如果你將例中「document.Add(new Paragraph(“Hello
World”));」中的字符串「Hello
Word」換成中文,如「這是自之第一個PDF文件」,產生的結果一定讓你大失所望,因為生成的PDF文件中並沒有將中文顯示出來,不要擔心,在第9段中假如專門講解字體問題,中文顯示也便化解了,如果无克正確顯示中文,也就是沒有必要翻譯本文了。
下對這幾步做詳細介紹。
第一步 創建一個Document實例:
iTextSharp.text.Document-object共来三個構造函數:
public Document();
public Document(Rectangle pageSize);
public Document(Rectangle pageSize,
int marginLeft,
int marginRight,
int marginTop,
int marginBottom);
率先個構造函數以A4頁面作為參數調用第二個構造函數,第二個構造函數以各国邊36约頁邊距為參數調用第三個構造函數
u 頁面尺寸:
卿可以通過指定的顏色和尺寸創建你协调的頁面,示例代碼0102創建一個細長的淺黃色背景的頁面:
Rectangle pageSize = new Rectangle(144, 720);
pageSize.BackgroundColor = new Color(0xFF, 0xFF, 0xDE);
Document document = new Document(pageSize);
习以为常,你不要創建這樣的頁面,而得從下面頁面尺寸中選擇:
A0-A10, LEGAL, LETTER, HALFLETTER, _11x17, LEDGER, NOTE, B0-B5,
ARCH_A-ARCH_E, FLSA 和 FLSE
大多數情況下以縱向頁面,如果愿意采取橫向頁面,你一味須使用rotate()函數:
Document document = new Document(PageSize.A4.rotate());
詳細代碼見示例代碼0103。
u 頁邊距:
當創建一個文书時,你還可以定義上、下、左、右頁邊距:
Document document = new Document(PageSize.A5, 36, 72, 108, 180);
每当示范代碼0104中公可看出該文檔有一個0.5英吋的左邊距同1英吋的右邊距,上邊距為1.5英吋,下邊距為2.5英吋。
說明:
當創建一個矩形或設置邊距時,你或许希望了解該用什麼度量單位:厘米、英吋或象素,事實上,默認的量系統以排版單位磅為基礎得出另外單位的滨似值,如1英吋=72志,如果你想当A4頁面的PDF中創建一個矩形,你用計算以下數據:
21 厘米 / 2.54 = 8.2677 英吋
8.2677英吋* 72 = 595 磅
29.7 厘米 / 2.54 = 11.6929 英吋
11.6929英吋* 72 = 842 磅
默認邊距為36磅即半英吋。
假如您改改了頁面尺寸,僅僅影響到下一样頁,如果你改改了頁邊距,則影響到周,故慎用。
關於頁面的开头值,請參考第三步。
第二步 創建Writer實例
倘創建了document,我們可以創建該文檔的几近個Writer的實例,所有這些Writer實例均繼承自抽像類「iTextSharp.text.DocWriter」。
同時還有另外一種情況,你得为此iTextSharp.text.pdf.PdfWriter產生文檔PDF文件,如果你想創建一個TeX文檔,你可以采用iTextSharp.text.TeX.TeXWriter包。
Writer類的構造函數是私房的,你不得不通過下面的章程創建一個實例:
public static xxxWriter getInstance(Document document, Stream os);(xxx
是 Pdf 或 Xml)
君得通過下面的法創建一個實例:
PdfWriter writer = PdfWriter.getInstance(document, new
FileStream(“Chap01xx.pdf”));
而若幾乎永遠不會用到Writer實例(除非你想創建高級PDF或者想用有些分外非常之函數,如ViewerPreferences
或 Encryption)。所以通過下面的辦法得到實例已經足夠了:
PdfWriter.getInstance(document, new FileStream(“Chap01xx.pdf”));
每当率先步着創建一個文檔時,第一個參數意義不老,第二個參數可以是其它一样種流,到即為止我們一直下System.IO.FileStream將Document寫入文件中,示例代碼0105用到了System.IO.MemoryStream(這不是一個獨立的例子,你必須在Servlet
Engine中測試這些代碼。
第三步 打開Document
u 摘要
当你寫入另外實際數據之前,你可能要通過以下幾種方法寫入一些關於本文檔的摘要:
public boolean addTitle(String title)
public boolean addSubject(String subject)
public boolean addKeywords(String keywords)
public boolean addAuthor(String author)
public boolean addCreator(String creator)
public boolean addProducer()
public boolean addCreationDate()
public boolean addHeader(String name, String content)
乃可選擇自己之標題、主題、關鍵字、作者、創建程序,但以下產品信息將始終被增长:iTextSharp
(或者iTextSharp的援)和創建時間(實際上這兩種方法是自動調用的)。
汝還可以將自定義的名稱添加為「報頭信息」,但是這對於PdfWriter沒有任何作用,如果看實例代碼0101產生的pdf文件之「文檔屬性」,我們可以观看僅僅有PDF創建程序及產品日期,而示例代碼0106的「文檔屬性」框中产生重多的信。

 

 

 

 

u 古希臘語
因為古希臘語經常使用,在類Phrase的構造函數中有一個特徵:將一個字符串作為參數(如果你想避免這種情況,你不得不利用塊工作如果休能够以字符串),正使您以演示代碼0203中视的,這個特徵自動地將913至937(除903)和945及969(古希臘的ASCII值)範圍內的有所字體改為希臘符號。
u 非主要性
與其說這是一個特徵,不如說是一個败笔,但無論如何,這使創建一個未主要性的亏句或段落成為可能,這將產生一個由下向上書寫的臨時作用(參見示例代碼0204)。如果你想在平頁中將一些职移動到面時可能有因此。
說明,當你通过上邊屆時無法檢查,也沒有辦法讓你回来前同一頁。
段落
段是如出一辙多重塊和(或)短句。同短句一樣,段落有確定的間距。用戶還可以指定縮排;在邊和(或)右邊保留一定空白,段落可以不当對齊、右對齊和在中對齊。添加到文檔中的诸一個段將自動另打一行。有幾種辦法建立一個段落,如:
Paragraph p1 = new Paragraph(new Chunk(“This is my first paragraph.”,
FontFactory.getFont(FontFactory.HELVETICA, 12)));
Paragraph p2 = new Paragraph(new Phrase(“This is my second paragraph.”,
FontFactory.getFont(FontFactory.HELVETICA, 12)));
Paragraph p3 = new Paragraph(“This is my third paragraph.”,
FontFactory.getFont(FontFactory.HELVETICA, 12));
不无小對像將被补加到段中:
p1.add(“you can add strings, “); p1.add(new Chunk(“you can add chunks
“)); p1.add(new Phrase(“or you can add phrases.”));
說明:一個段子有一個都僅有一個間距,如果你上加了一個例外字體的缺失句或塊,原來的間距仍然有效,你得通過SetLeading來改變間距,但是段落中保有內容將使新的受之間距。見示例代碼0205。
u 保持段落的整體性
当演示代碼0206中,我們使用了setKeepTogether(true)方法來試圖將一個段子在同頁中,該方法並不是始終有效,舉個例子,第一段未可知剛好以同頁中,於是被分成了兩有的。第二段子为放于其次頁,但第三截順沿到了第三頁上。
字體的延續
你應該掌握字體延續的片段規則,這些規則的應用見示例代碼0207,當我們將一些內容用指定的字體(非默認字體)創建一個短句或者段落後又补偿加更多內容時,初始對象的字體風格將被延續,請看「Hello
1!」和「Hello 2」:
Phrase myPhrase = new Phrase(“Hello 2! “, new
Font(Font.TIMES_NEW_ROMAN, 8, Font.BOLD));
myPhrase.Add(new Phrase(“some other font “, new Font(Font.HELVETICA, 8,
Font.ITALIC)));
myPhrase.Add(new Phrase(“This is the end of the sentence.\n”, new
Font(Font.TIMES_NEW_ROMAN, 8, Font.ITALIC)));
document.Add(myPhrase);
我們由Times New Roman
粗體字開始,添加一些文本以Helvetica字體而非点名風格,我們發現文本为改變成了粗體,當我們再加有文书以Times
New Roman字體和斜體風格,結果變成了有些斜體。
倘若我們使用FontFactory來創建字體,字體風格不會被延續,因為FontFactory使用了另外的技術構建一個字體:
myPhrase = new Phrase(“Hello 1bis! “,
FontFactory.getFont(FontFactory.TIMES_NEW_ROMAN, 8, Font.BOLD));
myPhrase.Add(new Phrase(“some other font “,
FontFactory.getFont(FontFactory.HELVETICA, 8, Font.ITALIC)));
myPhrase.Add(new Phrase(“This is the end of the sentence.\n”,
FontFactory.getFont(FontFactory.TIMES_NEW_ROMAN, 8, Font.ITALIC)));
document.Add(myPhrase);
每当面的代碼中,使用Helvetica字體的文书風字體沒有指定(既无是粗體也无是斜體)。採用Times
New Roman的額外文本僅僅顯示為斜體。
而啊观看我們添加了一個段落,添加該段落就似一個短句。
Paragraph myParagraph = new Paragraph(“Hello 1! “, new
Font(Font.TIMES_NEW_ROMAN, 8, Font.BOLD));
myParagraph.Add(new Paragraph(“This is the end of the
sentence.”,FontFactory.getFont(new Font.TIMES_NEW_ROMAN, 8)));
document.Add(myParagraph);
卿得无這樣做,但將失去字體風格的延續,首先不用任何字體創建段落(例中我們僅僅給字體出間距為1.5倍增),然後添加內容的异部分。

u 下劃線/刪除線
一旦你要有塊有下劃線或刪除線,你得通過改變字體風格簡單做到:
Chunk chunk1 = new Chunk(“This text is underlined”,
FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE));
Chunk chunk2 = new Chunk(“This font is of type ITALIC | STRIKETHRU”,
FontFactory.getFont(FontFactory.HELVETICA, 12, Font.ITALIC |
Font.STRIKETHRU));
u 上標/下標
于塊中来幾個方法好調用,其中绝大多数將在联网下來的章節中介紹,本章中只有介紹一個方法
setTextRise(float f). 你得应用該方法以上標或下標中寫塊。
u 塊的背景
假设你想改變塊的背景,你可行使方式setBackground(Color color).
這將在塊文本的下加加一個绚丽多彩矩形:
ck.setBackground(new Color(0xFF, 0xFF, 0x00));
当示范代碼0101中,你可以概覽典型字體1同一個施用setTextRise,
setBackground等方式的底例证。
短句
短句(Phrases)是如出一辙多样以特定間距(兩行之間的距離)作為參數的塊,一個短句有一個主字體,但缺少句被的局部塊具有不同於主字體的字體,你产生再多的選擇去創建短句,一些具體使用參見代碼0202。

myParagraph = new Paragraph(12);
myParagraph.Add(new Paragraph(“Hello 3! “, new
Font(Font.TIMES_NEW_ROMAN, 8, Font.BOLD)));
myParagraph.Add(new Paragraph(“This is the end of the sentence.”, new
Font(Font.TIMES_NEW_ROMAN, 8, Font.ITALIC)));
document.Add(myParagraph);
一旦您以了Phrase對象,你同樣會失去字體風格的延續:
myPhrase = new Phrase(12);
myPhrase.Add(new Phrase(“Hello 4! “, new Font(Font.TIMES_NEW_ROMAN, 8,
Font.BOLD)));
myPhrase.Add(new Phrase(“This is the end of the sentence.”,
newFont(Font.TIMES_NEW_ROMAN, 8, Font.ITALIC)));
document.Add(myPhrase);
u 更改分割符
常备,當文本不能够在一行時,文本將被细分成不同之片,iText首先會查找分割符,如果沒有找到,文本將在行尾被截斷。有有預定的划分符如「
」空格和「-」連字符,但是若可以使setSplitCharacter方法來覆蓋這些默認值。在示范代碼0208中,你得看看當到達行尾時一個塊是什么样给剪切的。然後分隔符被改变成为點「.」,該行在該字符處被划分。
老三节 錨點、列表和註釋
錨點
我們都明白HTML中的超文本鏈接,當我們點擊某些語句,你能夠跳轉到網上的旁頁。在PDF中吗足以實現這種功能。事實上,在第十一章节整個章節中产生關於PDF鏈接的介紹,但這是iText的又高級的應用,本章中我們處理簡單的iText。
如果您想在文檔中上加一個外表鏈接(例如使用URL鏈接到WEB上之另文檔),你可簡單地运用Anchor對象,它派生於Phrase對象,使用办法一致。只有兩種額外方法定義兩種額外變量:setName和
setReference。
表面鏈接示例:
Anchor anchor = new Anchor(“website”,
FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE, new
Color(0, 0, 255)));
anchor.Reference = “http://itextsharp.sourceforge.net”;
anchor.Name = “website”;
要是您想上加內部鏈接,你待選擇該鏈接不同的名稱,就如您相位在HTML中行使名稱作為錨點一樣。為達到該目的,你要丰富一個「#」。
內部鏈接示例:
Anchor anchor1 = new Anchor(“This is an internal link”);
anchor1.Name = “link1”;
Anchor anchor2 = new Anchor(“Click here to jump to the internal
link”);
anchor.Reference = “#link1”;
這兩個鏈接的例子請見示例代碼0301。
列表
通過類List
和ListItem,你得添加列表到PDF文件中,對於列表你還可以選擇是否排序。
脱序列表示例:
List list = new List(true, 20);
list.Add(new ListItem(“First line”));
list.Add(new ListItem(“The second line is longer to see what happens
once the end of the line is reached. Will it start on a new line?”));
list.Add(new ListItem(“Third line”));
結果如下:
First line
The second line is longer to see what happens once the end of the line
is reached. Will it start on a new line?
Third line
免排序示例如下:
List overview = new List(false, 10);
overview.Add(new ListItem(“This is an item”));
overview.Add(“This is another item”);
結果如下:
This is an item
This is another item
你可以通過setListSymbol方法更改列表符號:
// 用字符串作為列表符號
list1.ListSymbol = “*”;
// 用Chunk 作為列表符號(包含「•」字符)
list2.ListSymbol = new Chunk(“\u2022”,
FontFactory.getFont(FontFactory.HELVETICA, 20));
//用圖片作為列表符號
list3.ListSymbol = new Chunk(Image.getInstance(“myBullet.gif”), 0, 0);
還可以行使setIndentationLeft和setIndentationRight方法設置縮排,列表符號的縮排在構造函數中設置。更多之例子請參見示例代碼0302。
註釋
iText支持不同風格的註釋。
u 文本註釋:
而可互补加同粗截文本及你的文檔中,但她並非文檔內容的均等有的,註釋有標題和內容:
Annotation a = new Annotation(
“authors”,
“Maybe it’s because I wanted to be an author myself that I wrote
iText.”);
u 外部鏈接註釋:
君用指定一個而點擊的矩形和一個字符串(URL描述)或URL對像:
Annotation annot = new Annotation(100f, 700f, 200f, 800f, new
URL(“http://www.lowagie.com”));
Annotation annot = new Annotation(100f, 700f, 200f, 800f,
“http://www.lowagie.com”);
u 外部PDF文件鏈接註釋:
而要指定一個可點擊的矩形和一個字符串(文件名稱)和目的文件或者頁碼。
Annotation annot = new Annotation(100f, 700f, 200f, 800f, “other.pdf”,
“mark”);
Annotation annot = new Annotation(100f, 700f, 200f, 800f, “other.pdf”,
2);
u 指定行為鏈接註釋
卿需要指定一個只是點擊的矩形和一個指定的行為:
Annotation annot = new Annotation(100f, 700f, 200f, 800f,
PdfAction.FIRSTPAGE);
u 應用程序鏈接註釋:
你得指定一個可點擊的矩形和一個應用程序:
Annotation annot = new Annotation(300f, 700f, 400f, 800f,
“C://winnt/notepad.exe”, null, null, null);
我們無須在頁面上指定一個职,iText會內部處理。你能夠看到iText添加文本註釋在頁面上當前位置下面,第一個在段後第一行下面,第二個在短句結束處的底。
备其他註釋需要指定想匹配的矩形區域,在示范代碼0304饱受,我們畫了片刚好方形(使用的函數將在第十章中介紹),為每個正方形添加了部分鏈接註釋。
季章节 頁眉頁腳、章節、區域和繪圖對像
运用于第三顶第五节中描述的大气簡單iText對象可以避免双重多的高級話題(第九到十二回),緊記這些簡單對像限制的意义,大量複雜的意义在第三组成部分。
頁眉頁腳
HeaderFooter對象可以於為文檔每頁添加頁眉和頁腳。這樣一個頁眉或頁腳包含一個標準的短句(如果欲)和當前頁碼,如果你得重多複雜的頁眉和頁腳(使用表格或者第幾頁共幾頁),請閱讀第十二回。
于示范代碼0401惨遭,你得看来我們首先补充加了一個暗含頁碼沒有任何邊框的頁腳。
HeaderFooter footer = new HeaderFooter(new Phrase(“This is page: “),
true);
footer.Border = Rectangle.NO_BORDER;
document.Footer = footer
我們還可以采用下的構造函數:
HeaderFooter footer = new HeaderFooter(new Phrase(“This is page “), new
Phrase(“.”));
構造函數知道你要增长一個頁碼和將其放于兩個短句間,如果你独自是設置一個HeaderFooter而不改變邊框,頁眉或頁腳的文书上下各起同等條直線。
HeaderFooter header = new HeaderFooter(new Phrase(“This is a header
without a page number”), false);
document.Header = header;
章節和區域
每当第十一章节中將描述如何構建一個樹的外觀,如果你就需要一個簡單的章節和(子)區域,你得用Chapter對像与Section對像自動構建一個樹:
Paragraph cTitle = new Paragraph(“This is chapter 1”, chapterFont);
Chapter chapter = new Chapter(cTitle, 1);
Paragraph sTitle = new Paragraph(“This is section 1 in chapter 1”,
sectionFont);
Section section = chapter.addSection(sTitle, 1);
在演示代碼0402备受,我們添加了平层层之章節和子區域,你可以看来完整的樹形,樹形結構默認打開,如果您想有節點關閉,你必須使用用BookmarkOpen屬性其值為false,詳見示例代碼0403。
圖形
倘若你想上加圖形,如直線、圓、幾哪窗體,你應該閱讀讀十章,但要是您偏偏待部分片的功能,你可以动用Graphic對像
Graphic grx = new Graphic();
//添加一個矩形
grx.rectangle(100, 700, 100, 100);
// 添加相同條斜線
grx.moveTo(100, 700);
grx.lineTo(200, 800);
// 將圖形顯示出來
grx.stroke();
document.Add(grx);
整体的代碼請見示例代碼0404,如果想见到整个底措施,請參見PdfContentByte對像API。
當你想給頁面加一個邊框或者在文书當前职务畫一條水平線時,圖形對像那个管用。下面的办法用指定的寬度、間距(如果用)和顏色畫一個邊框。
public void setBorder(float linewidth, float extraSpace);
public void setBorder(float linewidth, float extraSpace, Color color);
脚的法门用指定的寬度(如果要)和顏色畫一條水平線,線的長度是点名兩邊緣間可用面積的底百分比。
public void setHorizontalLine(float linewidth, float percentage)
public void setHorizontalLine(float linewidth, float percentage, Color
color)
演示代碼5吃,有一個離邊界5约,線寬3约的邊框,還有兩條水平線,一條為黑色,5称寬,可用空間的100%,另外一條為紅色,線寬3志,可用空間的80%。
第五章 表格
重點:如果你僅僅生成PDF文件(沒有XML、HTML、RTF……),使用類pdfPTable代替類Table更好。
有些簡單的表格
一個表是含單元格排列成矩陣的矩形區域。表格的距陣並不求凡m×n的,它可有空洞或者單元格比單個的只要深。
創建一個表格最通用的辦法是預先知道出幾推行幾排列:
public Table(int columns, int rows);
以演示代碼0501中,我們構建了一個簡單的发明:
Table aTable = new Table(2,2);
aTable.addCell(“0.0”);
aTable.addCell(“0.1”);
aTable.addCell(“1.0”);
aTable.addCell(“1.1”);
該表格来兩履兩排,單元格给自動添加,從第一执第一排列開始,然後是第二排列,當一行滿後,下一样單元格自動添加到下一行的第一排列着。
为可將單元格添加到表中指定的职务,如示例代碼0502,別了一旦加加System.Drawing.dll引用,以獲得Point對象,我們創建了一個4行4列的报表然後添加有單元格到隨機的职上:
Table aTable = new Table(4,4);
aTable.AutoFillEmptyCells = true;
aTable.addCell(“2.2”, new Point(2,2));
aTable.addCell(“3.3”, new Point(3,3));
aTable.addCell(“2.1”, new Point(2,1));
aTable.addCell(“1.3”, new Point(1,3));
您得视我們將AutoFillEmptyCells屬性設置為true,這將自動、默認的單元格佈局填充空的單元格,如果我們忘記了這樣做(就如本例中第二個表格),將沒有額外的單元格添加,不包含其他單格的实践啊將被忽视,在本例中,第一执將不顯示,因為該行是空行。
經常用數據庫查詢結果來填充表格,大多數情況下,你預先並不知底到底得有些行,這就是為什麼還有第二個構造函數的缘故:
public Table(int columns);
iText根據需要自動添加行,在示范代碼0503中,初始化了4履4列,當我們添加第6执及第7尽的單元格時,iText自動增加行數到7。
增列數也是唯恐的,但是有點麻煩,它不能自動生成,你必須使用addColumns方法並設置列寬,詳見示例代碼0504。
片报表參數
前例子中的报表並不美觀,我們可以設置大量的參數來改變表格外觀。類Table和類Cell派生於類Rectangle,我們可以用大方天下无双的Rectangle方法,讓我們來看看示例代碼0505。
Table table = new Table(3);
table.BorderWidth = 1;
table.BorderColor = new Color(0, 0, 255);
table.Cellpadding = 5;

xRefs.Add(mPDF.Length);
strPDFMessage=”1 0 obj\n”;
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage=”<< /Length 2 0 R >>\n”;
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage=”stream\n”;
ConvertToByteAndAddtoStream(strPDFMessage);
……
在押了方的製作辦法,我眼鏡都损坏壞了三幅,如果用点這樣原始的辦法能製作出滿意的PDF文件,那必是天才所為。後來,我從一個網站(網址:http://itextsharp.sourceforge.net/index.html)中看到了專門製作PDF文件的控件的介紹,暗喜之餘,立馬下載試驗,果然非常輕鬆地製作出了想要的PDF文件,因為網站為英文,內容又多,讀起來非常費力,在解決了自己的問題後,看到許多網友還在為PDF文件製作而鬱悶,遂決定將該內容翻譯為中文,由於本人英語水平一般,許多地方又晦澀難懂,故翻譯質量不是很滿意,敬請斧正,但大部分能看懂。本文的目的一是解決部分網友的燃眉之急,二是拋磚引玉,如果哪位仁兄願意將該網站中的內容準確翻譯出來,則是天下之大幸。
只要用本文的艺术生成PDF文件,需要兩個控件:itextsharp.dll和ICSharpCode.SharpZipLib.dll,由於示例代碼實在太多,我將代碼全部整理出來,放在另外一個文本「示例代碼.doc」中,所有這些資源,我皆在了自家的ftp站點(ftp://202.107.251.26)上之「Pdf文件製作全攻略」文件夾中(文件夾中另外兩個rar壓縮文件為兩個控件的源代碼,供大家學習研究用),你可到這裡下載相應的資源,或者直接到原来網站下載。
為便於調試和敘述,所有例子均為DOS控制台程序,windows程序采取办法了一樣,按照下面的步驟創建一個不过調試的項目:
1、 打開VS2003;
2、 單擊菜單「文件」→「新建」→「項目」,在項目類型中選擇「Visual
C#項目」,在模板被選擇「控制台應用程序」,輸入文件名稱如「MakePdf」,指定好存放路徑,然後點確定按鈕;
3、
在「解決方案資源管理器」中右鍵單擊「引用」,從彈出的菜單中選擇「添加引用」,在「.NET」選項夾中選擇「瀏覽」,添加面前提到的兩個應用,如下圖:

 

PdfTable
于第5章中,我們簡要地講述了PdfPTable對象,現在我們將討論該對像更多之之特点。
而可就此3種不同之方法創建PdfTable:
PdfPTable(float[] relativeWidths);
PdfPTable(int numColumns);
PdfPTable(PdfPTable table);
乃可給該表設置更多的參數,如表寬度、列寬度、水平對齊方式等,你得通過下面的辦法添加單元格:
public void addCell(PdfPCell cell);
public void addCell(PdfPTable table);
public void addCell(Phrase phrase);
public void addCell(String text);
除却單元格填距和及間距,這些方法同Table對像非常類似。這些參數對每個單元格個體進行了設置,當然,你可設置單元格的默認值,為改變單元格的默認值,使用getDefaultCell()和調用一個还是重复多的類PdfPCell的不二法门(你可設置對齊方式、間距、邊框、顏色甚至低于高度)。
註:通過PdfPTable,你能改變一個單元格的排列跨度,但切莫克改變行跨度!在PdfPTable內部是有獨立的实践,要讓它支持实施跨度更改需要對PdfPTable對像進行很充分的調整,不要期待在近年来內實現,你可以就此嵌套表來解決這些問題。
而可像第5章一樣將一個PdfPTable添加到當前文檔中,但您呢得以添加一個发明在當前頁中的絕對位置:
public float writeSelectedRows(int rowStart, int rowEnd, float xPos,
float yPos, PdfContentByte canvas);
參數rowStart是公想開始的尽的數目,參數rowEnd是您想顯示的最後的行(如果你想顯示所有的推行,用-1),xPos和yPos是表格的坐標,canvas是一個PdfContentByte對象。在示范代碼1009遇,我們添加了一個阐明在(100,600)處:
table.writeSelectedRows(0, -1, 100, 600, writer.DirectContent);
用PdfPTable,你无能够設置行跨度和(或)來跨度(怎麼和方的产生點矛盾?)你可采取嵌套表來解決,見示例代碼1010。
最後,示例代碼1011和示范代碼1012来得了PdfTable可以跟templates 和
columns一起用,在示范代碼1012受將用到cover.png圖片如下:

C3

u 單元格間距和填距
当第4执遭,我們設置了报表的填距,就是單元格邊界和內容間一定數量的空間,在眼前的言传身教中,我們看到文本緊貼邊界,通過使用用特定的填距,就得避免。
每当第5实施被,我們設置了表的間距,就是單元格和表格邊界間的大势所趋數量的空間,不同之單元格間使用了半數空間,具體代碼見示例代碼0506。
u 對齊方式
每当演示代碼0506中,我們也改變了單元格「big cell」的對齊方式:
cell.HorizontalAlignment = Element.ALIGN_CENTER;
cell.VerticalAlignment = Element.ALIGN_MIDDLE;
註:不克總是相信垂直對齊方式。
u 邊框
若果我們像于第14实践吃那樣添加了一個單元格,將使默認的單元格佈局(默認的佈局可以SetDefalut方法改變),如果我們使用了Cell對象,我們可以控制每一個單元格的佈局。
于第2与老三蒙,我們設置整個表格的邊框寬度和邊框顏色,我們在單元格上足下的主意,在12行中,每個單元格用「box」作為邊界繪製(就像以HTML中),但是示例代碼0507顯示,我們在PDF中生大气重新多或者。
u 顏色
每当第22行遭到,你为能够定義單元格的背景色,在示范代碼0507中,我們不应用顏色只是用自然灰度填充。
u 行跨和列跨
最後,你啊能設置單元格的行跨(11/20实践)和列跨(8/21排)。通過這種方法可將幾個單元格合併成一個怪之單元格。
u 備註
第7行于PDF中沒有意義,用於生成HTML,在HTML中並不是總能產生同樣的佈局,PDF表格有點像:

 

 

相关文章