(轉)Aspose.words編程指南之DocumentBuilder一

原文鏈接:https://blog.csdn.net/sinat_30276961/article/details/48267741

https://blog.csdn.net/sinat_30276961/article/details/48267741

上一篇Aspose.words編程指南之Working with Document介紹了Document類相關的操作,包含document的屬性,document繼承自Node的一些特性,以及它的clone。這一篇將接着講操作document的一個關鍵類:DocumentBuilder。

總覽

DocumentBuilder是一個用來操作Document的很強大的類。它提供了一系列的方法,方便你插入文本、段落、列表、表格、圖片和其他內容。使用它有點類似於使用java的StringBuilder。

DOM的Node能辦到的事,使用DocumentBuilder也一樣能辦到。而且比使用dom的方式操作document的代碼要少。

DocumentBuilder內部維護了一個遊標Cursor,它允許你指向任何你想指向的地方。我們通過調用DocumentBuilder.MoveToXXX這個方法來指向。比方說,DocumentBuilder.MoveToDocumentStart,DocumentBuilder.MoveToField。

MoveToXXX之後,你可以通過DocumentBuilder.InsertXXX在那裏插入文字,圖片,書籤,域或者是其他元素。比方說, DocumentBuilder.InsertField, DocumentBuilder.InsertHtml。

插入元素

接下去,我就詳細講下用DocumentBuilder怎麼插入各種類型的元素。

插入字符串

要插入一段字符串,我們可以通過使用DocumentBuilder.write。然後文字規格類型,是通過Font類來控制。
我們來看下實例:

DocumentBuilder builder = new DocumentBuilder();

// Specify font formatting before adding text.
Font font = builder.getFont();
font.setSize(16);
font.setBold(true);
font.setColor(Color.BLUE);
font.setName("Arial");
font.setUnderline(Underline.DASH);

builder.write("Sample text.");

可以看到,Font是通過builder.getFont();獲取到的。

插入Paragraph

DocumentBuilder.writeln,看到這個,聰明的你肯定知道,這個是比write多了個換行。對的,不過,這裏的換行也被看做是paragraph break,顧名思義,專門用來結束這個paragraph的。

然後調用DocumentBuilder.writeln,和write一樣,需要DocumentBuilder.Font,它還可以需要DocumentBuilder.ParagraphFormat,用來設定paragraph的格式。

代碼實例:

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

// Specify font formatting
Font font = builder.getFont();
font.setSize(16);
font.setBold(true);
font.setColor(Color.BLUE);
font.setName("Arial");
font.setUnderline(Underline.DASH);

// Specify paragraph formatting
ParagraphFormat paragraphFormat = builder.getParagraphFormat();
paragraphFormat.setFirstLineIndent(8);
paragraphFormat.setAlignment(ParagraphAlignment.JUSTIFY);
paragraphFormat.setKeepTogether(true);

builder.writeln("A whole paragraph.");

插入表格

用DocumentBuilder創建一個表格是一件很簡單的事,大體可以分爲7步:

1.開始創建,通過DocumentBuilder.StartTable。
2.通過DocumentBuilder.InsertCell插入一個單元格。如果需要更改格式,使用DocumentBuilder.CellFormat。
3.在Cell裏通過DocumentBuilder插入文本。
4.重複步驟2和3,插入多格內容。
5.通過調用DocumentBuilder.EndRow來結束當前一行。如果需要,你可以通過DocumentBuilder.RowFormat來指定一行的格式。
6.重複步驟2 - 5,插入多行內容。
7.調用DocumentBuilder.EndTable來結束一個表格編輯。

這裏再詳細講解下每個步驟:

StartTable

創建一個表格的第一步就是DocumentBuilder.StartTable。要注意的是,這個也可以在一個單元格里調用,這樣就創建了一個內嵌的表格。

InsertCell

通過調用DocumentBuilder.InsertCell在當前行插入一個單元格,在裏面,你可以寫入內容。然後要繼續在當前行添加單元格,繼續調用DocumentBuilder.InsertCell。

通過DocumentBuilder.CellFormat來指定單元格的格式。

EndRow

通過調用DocumentBuilder.EndRow來結束當前一行的編輯。如果你接着再調用DocumentBuilder.InsertCell,那就會在新的一行開始創建單元格。

通過DocumentBuilder.RowFormat來指定一行的格式。

EndTable

通過調用DocumentBuilder.EndTable來結束一個表格。要注意的是,在調用這個之前,要先調用DocumentBuilder.EndRow。原因很簡單,通過調用endRow,把DocumentBuilder的Cursor遊標移出那一行。

我們來看下代碼實例:

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

Table table = builder.startTable();

// Insert a cell
builder.insertCell();
// Use fixed column widths.
table.autoFit(AutoFitBehavior.FIXED_COLUMN_WIDTHS);

builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
builder.write("This is row 1 cell 1");

// Insert a cell
builder.insertCell();
builder.write("This is row 1 cell 2");

builder.endRow();

// Insert a cell
builder.insertCell();

// Apply new row formatting
builder.getRowFormat().setHeight(100);
builder.getRowFormat().setHeightRule(HeightRule.EXACTLY);

builder.getCellFormat().setOrientation(TextOrientation.UPWARD);
builder.writeln("This is row 2 cell 1");

// Insert a cell
builder.insertCell();
builder.getCellFormat().setOrientation(TextOrientation.DOWNWARD);
builder.writeln("This is row 2 cell 2");

builder.endRow();

builder.endTable();

上述三個代碼實例的運行結果,請看圖(我把它們寫一起了):

這裏寫圖片描述

插入break

如果你要明確指明開始新的一行、一個段落、一列、一個Section或者是一頁,通過調用DocumentBuilder.InsertBreak。分隔符break有多種類型,通過BreakType枚舉類來區分。

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

builder.writeln("This is page 1.");
builder.insertBreak(BreakType.PAGE_BREAK);

builder.writeln("This is page 2.");
builder.insertBreak(BreakType.PAGE_BREAK);

builder.writeln("This is page 3.");

插入圖片

我們通過調用DocumentBuilder.InsertImage來插入一張圖片,插入的方式有兩種:內嵌和懸浮,分別通過InsertImage的兩種重載方法。

大部分情況下,我們插入的圖片會以png形式儲存到文檔裏。

插入圖片的來源可以分爲以下四種:

1.來自文件。
2.來自一個輸入流。
3.來自緩存Image。
4.來自一個byte array。

然後,DocumentBuilder.InsertImage會返回一個Shape類型。你如果需要,可以通過它修改一些屬性。

有人或許會問,內嵌圖片和懸浮圖片的區別是什麼?

內嵌圖片,顧名思義,就是內部嵌入一個圖片。它的特點是,圖片插入後,周圍環境會相應調整。

懸浮圖片,顧名思義,就是懸浮在上面的圖片。它的特點是,哪裏都能放,大不了覆蓋其他內容,也可以設置爲不覆蓋形式,所以這個需要指定位置和類型。

插入內嵌圖片

如下代碼顯示瞭如何插入內嵌圖片:

    builder.moveToParagraph(1, 0);

    Bitmap bitmap = MyApplication.decodeSampleBitmapResource(
            getResources(), R.drawable.a, 200, 300
    );

    // inline image
    builder.insertImage(bitmap,100,150);

上述有對圖片先進行了壓縮:decodeSampleBitmapResource,如果這塊不清楚的話,可以查看我先前寫的Android Bitmap大量使用不產生OOM之“加載大圖片資源優化”

如下圖,是內嵌圖片:

這裏寫圖片描述

插入懸浮圖片

如下代碼顯示瞭如何插入懸浮圖片:

    builder.moveToParagraph(1, 0);

    Bitmap bitmap = MyApplication.decodeSampleBitmapResource(
            getResources(), R.drawable.a, 200, 300
    );

    // floating image
    builder.insertImage(bitmap,
        RelativeHorizontalPosition.MARGIN,
        100,
        RelativeVerticalPosition.MARGIN,
        100,
        100,
        150,
        WrapType.NONE);

這裏,WrapType用來指定懸浮類型

懸浮圖片,如下圖:

這裏寫圖片描述

由於篇幅有限,關於插入就先寫到這,下一篇Aspose.words編程指南之DocumentBuilder二會繼續講解DocumentBuilder的插入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章