module Asposewordsjavaforruby::Bookmarks

Public Class Methods

new() click to toggle source
# File lib/asposewordsjavaforruby/bookmarks.rb, line 3
def initialize()
    # The path to the documents directory.
    @data_dir = File.dirname(File.dirname(File.dirname(__FILE__))) + '/data/bookmarks/'
    
    # Open the document.
    doc = Rjb::import('com.aspose.words.Document').new(@data_dir + 'TestDefect1352.doc')

    append_bookmark_text()

    # This perform the custom task of putting the row bookmark ends into the same row with the bookmark starts.
    untangle_row_bookmark(doc)
    
    # Now we can easily delete rows by a bookmark without damaging any other row's bookmarks.
    delete_row_by_bookmark(doc, 'ROW2')
end

Public Instance Methods

append_bookmark_text() click to toggle source
# File lib/asposewordsjavaforruby/bookmarks.rb, line 19
def append_bookmark_text()
    data_dir = File.dirname(File.dirname(File.dirname(__FILE__))) + '/data/bookmarks/'
    
    # Load the source document.
    src_doc = Rjb::import('com.aspose.words.Document').new(data_dir + "Template.doc")

    # This is the bookmark whose content we want to copy.
    src_bookmark = src_doc.getRange().getBookmarks().get("ntf010145060")

    # We will be adding to this document.
    dst_doc = Rjb::import('com.aspose.words.Document').new()
    
    # Let's say we will be appending to the end of the body of the last section.
    #node_type = Rjb::import('com.aspose.words.NodeType')
    dst_node = dst_doc.getLastSection().getBody()

    # It is a good idea to use this import context object because multiple nodes are being imported.
    # If you import multiple times without a single context, it will result in many styles created.
    import_format_mode = Rjb::import('com.aspose.words.ImportFormatMode')
    importer = Rjb::import("com.aspose.words.NodeImporter").new(src_doc, dst_doc, import_format_mode.KEEP_SOURCE_FORMATTING)

    # This is the paragraph that contains the beginning of the bookmark.
    start_para = src_bookmark.getBookmarkStart().getParentNode()
    
    # This is the paragraph that contains the end of the bookmark.
    end_para = src_bookmark.getBookmarkEnd().getParentNode()

    if (start_para == "" || end_para == "") then
        raise "Parent of the bookmark start or end is not a paragraph, cannot handle this scenario yet."
    end

    util = Rjb::import("java.io.InputStream")
    # Limit ourselves to a reasonably simple scenario.
    spara = (start_para.getParentNode()).to_string
    epara = (end_para.getParentNode()).to_string
    #p spara.strip
    #abort('spara')
    
    
    if spara.strip != epara.strip then
    #if (start_para.getParentNode() != end_para.getParentNode()) then
        raise "Start and end paragraphs have different parents, cannot handle this scenario yet."
    end
    
    # We want to copy all paragraphs from the start paragraph up to (and including) the end paragraph,
    # therefore the node at which we stop is one after the end paragraph.
    endNode = end_para.getNextSibling()
    
    # This is the loop to go through all paragraph-level nodes in the bookmark.
    curNode = start_para
    cNode = curNode
    eNode = endNode
    
    while (cNode != eNode) do
        # This creates a copy of the current node and imports it (makes it valid) in the context
        # of the destination document. Importing means adjusting styles and list identifiers correctly.
        newNode = importer.importNode(curNode, true)
        curNode = curNode.getNextSibling()
        cNode = curNode
        dst_node.appendChild(newNode)
    end

    # Save the finished document.
    dst_doc.save(data_dir + "Template Out.doc");
end
delete_row_by_bookmark(doc, bookmark_name) click to toggle source
# File lib/asposewordsjavaforruby/bookmarks.rb, line 108
def delete_row_by_bookmark(doc, bookmark_name)
    raise 'bookmark_name not specified.' if bookmark_name.empty?

    bookmark = doc.getRange().getBookmarks().get(bookmark_name)
    
    if bookmark.nil? then
        return 
    end
    
    # Get the parent row of the bookmark. Exit if the bookmark is not in a row.
    row = bookmark.getBookmarkStart().getAncestor(Rjb::import('com.aspose.words.Row'))

    if row.nil? then
        return
    end
    
    # Remove the row.
    row.remove()

    # Save the document.
    doc.save(@data_dir + "TestDefect1352 Out.doc")
end
untangle_row_bookmark(doc) click to toggle source
# File lib/asposewordsjavaforruby/bookmarks.rb, line 85
def untangle_row_bookmark(doc)
    bookmarks = doc.getRange().getBookmarks()
    bookmarks_count = bookmarks.getCount()

    i = 0
    while i < bookmarks_count do
        bookmark = bookmarks.get(i)
        row1 = bookmark.getBookmarkStart().getAncestor(Rjb::import("com.aspose.words.Row"))
        row2 = bookmark.getBookmarkEnd().getAncestor(Rjb::import("com.aspose.words.Row"))

        # If both rows are found okay and the bookmark start and end are contained
        # in adjacent rows, then just move the bookmark end node to the end
        # of the last paragraph in the last cell of the top row.
        if ((row1 != "") && (row2 != "") && (row1.getNextSibling() == row2)) then
            row1.getLastCell().getLastParagraph().appendChild(bookmark.getBookmarkEnd())
        end
        $i +=1
    end

    # Save the document.
    doc.save(@data_dir + "TestDefect1352 Out.doc")
end