itextsharp pdf to xml c# : How to add bookmarks to pdf files control SDK utility azure wpf .net visual studio Docx4j_GettingStarted2-part1693

21 
To figure this out, start with a docx that contains the construct (create it in Word if necessary). 
Now look at its XML. Choices: 
You can unzip it to do this 
upload it to the PartsList online webapp
save it as Flat OPC XML from Word (or use the 
ExportInPackageFormat
sample),  so you 
have just a single XML file which you don't need to unzip
you can use the 
DisplayMainDocumentPartXml 
to get it 
you can open it with docx4all, and look at the source view 
on Windows, if you have Visual Studio 2010, you can drag the docx onto it 
if you use Google͛s Chrome web browser, try 
OOXML Viewer for Chrome
Now you are ready to create this XML using JAXB.  There are 2 basic ways. 
The classic JAXB way is to use the ObjectFactory's .createX methods.  For example: 
ObjectFactory factory = Context.getWmlObjectFactory();  
P p = factory.createP();   
The challenge with this is to know what object it is you are trying to create.  To find this out, the 
easiest way by far is to use the PartsList online webapp.  Alternatively, you could run 
OpenMainDocumentAndTraverse 
on your document, or use Eclipse to search the relevant schema 
(in /xsd) or source code. 
Here are the names for some common objects: 
Object 
XML element 
docx4j class 
Factory method 
Document body  w:body 
org.docx4j.wml.Body 
factory.createBody(); 
Paragraph 
w:p 
org.docx4j.wml.P 
factory.createP() 
Paragraph 
props 
w:pPr 
org.docx4j.wml.PPr 
factory.createPPr() 
Run 
w:r 
org.docx4j.wml.R 
factory.createR() 
Run props 
w:rPr 
org.docx4j.wml.RPr 
factory.createRPr() 
Text 
w:t 
org.docx4j.wml.Text 
factory.createText() 
Table 
w:tbl 
org.docx4j.wml.Tbl 
factory.createTbl() 
Table row 
w:tr 
org.docx4j.wml.Tr 
factory.createTr() 
Table cell 
w:tc 
org.docx4j.wml.Tc 
factory.createTc() 
Drawing 
w:drawing 
org.docx4j.wml.Drawing 
factory.createDrawing() 
Page break 
w:br 
org.docx4j.wml.Br 
factory.createBr() 
Footnote  
or endnote ref 
org.docx4j.wml.CTFtnEdnRef  factory.createCTFtnEdnRef() 
An easier way to create stuff may be to just unmarshal the  XML (eg a String representing a 
paragraph to be inserted into the document). 
For example, given: 
<w:p  xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
<w:r> 
<w:t>Hello world</w:t> 
How to add bookmarks to pdf files - add, remove, update PDF bookmarks in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Your C# Project with Rapid PDF Internal Navigation Via Bookmark and Outline
export pdf bookmarks to excel; creating bookmarks pdf
How to add bookmarks to pdf files - VB.NET PDF bookmark library: add, remove, update PDF bookmarks in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Your VB.NET Project with Rapid PDF Internal Navigation Via Bookmark and Outline
add bookmarks pdf; excel hyperlink to pdf bookmark
22 
</w:r> 
</w:p
you can simply: 
// Assuming String xml contains the XML above 
org.docx4j.wml.P  para = XmlUtils.unmarshalString(xml); 
The PartsList online webapp can generate appropriate code for you, using both of these approaches.  
It also links to the Open XML spec documentation for the element. 
If you need to be explicit about the type, you can use: 
public static Object unmarshalString(String str, JAXBContext jc, Class declaredType) 
 ormatting  roperties 
Usually you format the appearance of things via an object͛s properties element: 
Object 
Method 
Paragraph 
P.getPPr() 
Run 
R.getRPr() 
Table 
Tbl.getTblPr() 
Table row 
Tr.getTrPr() 
Table cell 
Tc.getTcPr() 
In a docx, the appearance of text is basically determined by the style in the styles part which applies 
to it (styles can inherit from other styles), plus any direct formatting.   
Docx4j contains code for working out the effective formatting, which is used in its PDF output. 
In XHTML import, docx4j converts CSS into formatting properties. 
reating and adding a table 
org.docx4j.model.table.TblFactory provides an easy way to create a simple table. For an example of 
its use, see the CreateWordprocessingMLDocument sample.  If you want to add content, see 
General strategy/approach for creating stuff above.  If you want format your table (make it 
prettier), see Formatting Properties immediately above. 
Or you can use the PartsList online webapp to generate the code. 
If you are looking to fill table rows with data, consider OpenDoPE content control data binding (in 
which you ͞repeat͟ a table row). 
VB.NET PDF File Split Library: Split, seperate PDF into multiple
Add necessary references: how to split a PDF file into multiple ones by PDF bookmarks or outlines is an VB.NET example of splitting a PDF to two new PDF files.
how to create bookmarks in pdf file; bookmarks in pdf
C# PDF File Split Library: Split, seperate PDF into multiple files
Add necessary references: how to split a PDF file into multiple ones by PDF bookmarks or outlines This is an C# example of splitting a PDF to two new PDF files.
create pdf with bookmarks from word; pdf reader with bookmarks
23 
electing your insertion/editing point;  
accessing     X  nodes via X ath 
Sometimes, XPath is a succinct way to select the things you need to change. 
You can use XPath to select JAXB nodes: 
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart(); 
String xpath = "//w:p";  
List<Object> list = documentPart.getJAXBNodesViaXPath(xpath, false); 
These JAXB nodes are live, in the sense that if you change them, your document changes. 
There are a few limitations however in the JAXB reference implementation:  
the xpath expressions are evaluated against the XML document as it was when first opened 
in docx4j.  You can update the associated XML document once only, by passing true into 
getJAXBNodesViaXPath
. Updating it again (with current JAXB 2.1.x or 2.2.x) will cause an error. 
For some objects,JAX  can͛t get parent (with getParent) 
For some document, JAX  can͛t set up the XPath 
If these limitations are causing you problems, try using MOXy as your JAXB implementation, or see 
Traversing immediately below for a different approach. 
raversing a document 
OpenMainDocumentAndTraverse.java in the samples directory shows you how to traverse the JAXB 
representation of a docx.   
This is an alternative to XSLT, which doesn't require marshalling to a DOM document and 
unmarshalling again. 
The sample uses TraversalUtil, which is a general approach for traversing the JAXB object tree in the 
main document part.  It can also be applied to headers, footers etc.   TraversalUtil has an 
interface 
Callback, 
which you use to specify how you want to traverse the nodes, and what you want to do to 
them. 
As noted earlier, many objects (eg the document body, a paragraph, a run), have a List containing 
their content.  Traversal works by iterating over these lists.  
Traversing is a very useful approach for finding and altering parts of the document.   
For example, it is used in docx4j 2.8.0, to provide a way of producing HTML output without using 
XSLT/Xalan. 
The org.docx4j.finders package contains classes which make it convenient to find various objects. 
C# PDF File Compress Library: Compress reduce PDF size in C#.net
Bookmarks. Comments, forms and multimedia. Flatten visible layers. C#.NET DLLs: Compress PDF Document. Add necessary references: RasterEdge.Imaging.Basic.dll.
export pdf bookmarks to text; bookmark pdf documents
C# PDF Convert to HTML SDK: Convert PDF to html files in C#.net
converter toolkit SDK, preserves all the original anchors, links, bookmarks and font to Use C#.NET Demo Code to Convert PDF Document to Add necessary references
add bookmarks to pdf reader; creating bookmarks in pdf from word
24 
It is often superior to using XPath (owing to the limitations in the JAXB reference implementation 
noted above). 
Note also, in 
package org.docx4j.utils: 
/**  
* Use this if there is only a single object type (eg just P's) 
* you are interested in doing something with. 
public class SingleTraversalUtilVisitorCallback  
ImageConvertEmbeddedToLinked sample contains an example of the use of the above. 
/**  
* Use this if there is more than one object type (eg Tables and Paragraphs) 
* you are interested in doing something with during the traversal. 
public class CompoundTraversalUtilVisitorCallback 
Adding a Part 
What if you wanted to add a new styles part? Here's how: 
// Create a styles part 
StyleDefinitionsPart stylesPart = new StyleDefinitionsPart(); 
// Populate it with default styles 
stylesPart.unmarshalDefaultStyles(); 
 
// Add the styles part to the main document part relationships 
wordDocumentPart.addTargetPart(stylesPart); 
You'd take the same approach to add a header or footer. 
When you add a part this way, it is automatically added to the source part's relationships part. 
Generally, you'll also need to add a reference to the part (using its relationship id) to the Main 
Document Part.  This applies to images, headers and footers. (Comments, footnotes and endnotes 
are a bit different, in that what you add to the main document part are references to individual 
comments/footnotes/endnotes). 
mporting X  
From docx4j 2.8.0, docx4j can convert XHTML content (paragraphs, tables, images) into native 
WordML, reproducing much of the formatting.  If you are using this, v3 is highly recommended. 
From v3, the XHTML Import functionality is now a separate project on GitHub
The reason being that its main dependency – Flying Saucer - is licensed under LGPL v2.1 (as opposed 
to ASL v2, which docx4j͛s other dependencies use). 
If you want this functionality, you have to add these jars to your classpath. 
.NET PDF SDK - Description of All PDF Processing Control Feastures
Full page navigation, zooming & rotation; Outlines, bookmarks, & thumbnail display; PDF Text Write & Extract. Insert and add text to any page of PDF document with
how to bookmark a pdf file; bookmarks pdf file
C# Create PDF Library SDK to convert PDF from other file formats
PDF with a blank page, bookmarks, links, signatures, etc. metadata adding control, you can add some additional Create PDF Document from Existing Files Using C#.
creating bookmarks in pdf documents; add bookmark pdf file
25 
See the samples at https://github.com/plutext/docx4j-ImportXHTML/tree/master/src/samples 
docx to (X)  
docx4j can convert a docx to HTML or XHTML.  You will find the generated HTML is clean (in 
comparison to the HTML Word produces). 
Docx4j͛s HTML output is suitable for documents which contain paragraphs, tables and images.  It 
can͛t handle more exotic features, such as equations, SmartArt, or WordArt (DrawingML or VML). 
Elsewhere on the web, you͛ll find XSLT which can convert docx to HTML.  That XSLT is very complex, 
since it has to derive effective formatting from the hierarchy. 
In contrast, in docx4j, that logic is implemented in Java.   ecause of this, docx4j͛s XSLT is simple (Java 
XSLT extension functions do the heavy lifting). 
In docx4j, you can create output using XSLT, or by traversing the document in Java.  The façade lets 
you specify which: 
//Prefer the exporter, that uses a xsl transformation 
Docx4J.toHTML(htmlSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); 
//Prefer the exporter, that doesn't use a xsl transformation (= uses a visitor) 
// 
Docx4J.toHTML(htmlSettings, os, Docx4J.FLAG_EXPORT_PREFER_NONXSL); 
See the sample on GitHub at src/samples/docx4j/org/docx4j/samples/ConvertOutHtml.java 
If you have output logging enabled, anything which is not implemented will be obvious in the output 
document.  If debug level logging is not switched on, unsupported elements will be silently 
dropped. 
docx to    
docx4j produces XSL FO, which can in turn be used to create a PDF. 
You can try it with the online demo, at 
http://webapp.docx4java.org/OnlineDemo/docx_to_pdf_fop.html 
Generally speaking, docx4j͛s PDF output is suitable for documents which contain paragraphs, tables 
and images.  It can͛t handle more exotic features, such as equations, SmartArt, or WordArt 
(DrawingML or VML). 
At present, Apache FOP is integrated into docx4j for creating the PDF.  
See the sample on GitHub at src/samples/docx4j/org/docx4j/samples/ConvertOutPDF.java
XDoc.Word for .NET, Advanced .NET Word Processing Features
page navigation, zooming & rotation; Outlines, bookmarks, & thumbnail Convert Word to PDF; Convert Word to HTML5; Convert Add and insert a blank page or multiple
add bookmarks to pdf preview; add bookmarks to pdf
XDoc.Excel for .NET, Comprehensive .NET Excel Imaging Features
page navigation, zooming & rotation; Outlines, bookmarks, & thumbnail Convert Excel to PDF; Convert Excel to HTML5; Convert Add a blank page or multiple pages to
export pdf bookmarks; split pdf by bookmark
26 
If you have output logging enabled, anything which is not implemented will be obvious in the output 
document.  If debug level logging is not switched on, unsupported elements will be silently 
dropped. 
Fonts 
When docx4j is used to create a PDF, it can only use fonts which are available to it. 
These fonts come from 2 sources: 
those installed on the computer 
those embedded in the document 
Note that Word silently performs font substitution.  When you open an existing document in Word, 
and select text in a particular font, the actual font you see on the screen won't be the font reported 
in the ribbon if it is not installed on your computer or embedded in the document.  To see whether 
Word 2007 is substituting a font, go into Word Options > Advanced > Show Document Content and 
press the "Font Substitution" button.   
Word's font substitution information is not available to docx4j.  As a developer, you 3 options: 
ensure the font is installed or embedded 
tell docx4j which font to use instead, or 
allow docx4j to fallback to a default font 
To embed a font in a document, open it in Word on a computer which has the font installed (check 
no substitution is occuring), and go to Word Options > Save > Embed Fonts in File. 
If you want to tell docx4j to use a different font, you need to add a font mapping.  The FontMapper 
interface is used to do this. 
On a Windows computer, font names for installed fonts are mapped 1:1 to the corresponding 
physical fonts via the IdentityPlusMapper. 
A font mapper contains Map<String, PhysicalFont>; to add a font mapping, as per the example in the 
ConvertOutPDF sample: 
// Set up font mapper 
Mapper fontMapper = new IdentityPlusMapper(); 
wordMLPackage.setFontMapper(fontMapper); 
// Example of mapping missing font Algerian to installed font Comic Sans MS 
PhysicalFont font = PhysicalFonts.getPhysicalFonts().get("Comic Sans MS"); 
fontMapper.getFontMappings().put("Algerian", font); 
You'll see the font names if you configure log4j debug level logging for 
org.docx4j.fonts.PhysicalFonts
27 
Image Handling - DOCX 
When you add an image to a document in Word 2007, it is generally added as a new Part (ie you'll 
find a part in the resulting docx, containing the image in base 64 format). 
When you open the document in docx4j, docx4j will create an image part representing it. 
It is also possible to create a ͞linked͟ image.  In this case, the image is not embedded in the docx 
package, but rather, is referenced at its external location. 
Docx4j's 
BinaryPartAbstractImage
class contains methods to allow you to create both embedded 
and linked images (along with appropriate relationships). 
/** 
* Create an image part from the provided byte array, attach it to the  
* main document part, and return it.*/ 
public static BinaryPartAbstractImage createImagePart(WordprocessingMLPackage 
wordMLPackage, 
byte[] bytes)  
 
/** 
* Create an image part from the provided byte array, attach it to the source part 
* (eg the main document part, a header part etc), and return it.*/ 
public static BinaryPartAbstractImage createImagePart(WordprocessingMLPackage 
wordMLPackage, 
Part sourcePart, byte[] bytes)  
/** 
* Create a linked image part, and attach it as a rel of the specified source part 
* (eg a header part) */ 
public static BinaryPartAbstractImage createLinkedImagePart( 
WordprocessingMLPackage wordMLPackage, Part sourcePart, String fileurl)  
For an image to appear in the document, there also needs to be appropriate XML in the main 
document part.  This XML can take 2 basic forms: 
the Word 2007 w:drawing
form
<w:p> 
<w:r> 
<w:drawing> 
<wp:inline distT="0" distB="0" distL="0" distR="0"
<wp:extent cx="3238500" cy="2362200" /
<wp:effectExtent l="19050" t="0" r="0" b="0" /
<a:graphic > 
<a:graphicData  ..> 
<pic:pic > 
<pic:blipFill> 
<a:blip r:embed="rId5" /> 
</pic:blipFill> 
</pic:pic> 
</a:graphicData> 
</a:graphic> 
</wp:inline> 
28 
</w:drawing> 
</w:r> 
</w:p> 
the Word 2003 VML-based w:pict form
<w:p> 
<w:r> 
<w:pict> 
<v:shapetype id="_x0000_t75" coordsize="21600,21600"  .. 
<v:stroke joinstyle="miter" /> 
<v:formulas> 
</v:formulas> 
</v:shapetype> 
<v:shape .. style="width:428.25pt;height:321pt"
<v:imagedata r:id="rId4" o:title="" /
</v:shape> 
</w:pict> 
</w:r> 
</w:p> 
Docx4j can create the Word 2007 w:drawing/wp:inline
form for you: 
/** 
* Create a <wp:inline> element suitable for this image, 
* which can be linked or embedded in w:p/w:r/w:drawing. 
* If the image is wider than the page, it will be scaled 
* automatically.  See Javadoc for other signatures. 
@param filenameHint Any text, for example the original filename 
@param altText  Like HTML's alt text 
@param id1   An id unique in the document 
@param id2   Another id unique in the document 
@param link  true if this is to be linked not embedded */ 
public Inline createImageInline(String filenameHint, String altText,  
int id1, int id2, boolean link)  
which you can then add to a w:r/w:drawing. 
Finally, with docx4j, you can convert images from formats unsupported by Word (eg PDF), to PNG, 
which is a supported format.  For this, docx4j uses ImageMagick.  So if you want to use this feature, 
you need to install ImageMagick.  Docx4j invokes ImageMagick using: 
Process p = Runtime.getRuntime().exec("imconvert -density " + density + " -units PixelsPerInch - 
png:-"); 
Note the name imconvert, which is used so that we don't have to supply a full path to exec.  You'll 
need to accommodate that.   
Manual Image Manipulation 
Images involve three things: 
the image part itself 
29 
a relationship, in the relationships part of the main document part (or header part etc).  This 
relationship includes: 
o
the name of the image part (for example, 
/word/media/image1.jpeg
o
the relationship ID 
some XML in the main document part (or header part etc), referencing the relationship ID 
(see w:drawing and w:pict examples above) 
This means that if you are moving images around, you need to take care to ensure that the 
relationships remain valid.  
You can manually manipulate the relationship, and you can manually manipulate the XML 
referencing the relationship IDs. 
Given an image part, you can get the relationship pointing to it  
Relationship rel = copiedImagePart.getSourceRelationship(); 
String id = rel.getId(); 
You can then ensure the reference matches. 
Image Handling – PPTX 
See the pptx4j InsertPicture  sample. 
Adding Headers/Footers 
See the HeaderFooter sample for how to do this. 
Merging Documents and Presentations 
As Eric White͛s blog explained, combining multiple documents can be complicated: 
This programming task is complicated by the need to keep other parts of the document in 
sync with the data stored in paragraphs. For example, a paragraph can contain a reference 
to a comment in the comments part, and if there is a problem with this reference, the 
document is invalid. You must take care when moving / inserting / deleting paragraphs to 
maintain ͚referential integrity͛ within the document. 
The commercial edition of docx4j includes ͞MergeDocx͟ code  which makes merging documents as 
easy as invoking the method: 
public  WordprocessingMLPackage merge(List<WordprocessingMLPackage> wmlPkgs) 
In other words, you pass a list of docx, and get a single new docx back. 
To try it, visit 
http://webapp.docx4java.org/ 
30 
The commercial edition of docx4j includes MergePptx, which you can use to concatenate 
presentations. 
The MergeDocx extension can also be used to process a docx which is embedded as an altChunk.  
(Without the extension, you have to rely on Word to convert the altChunk to normal content, which 
means if your docx contains w:altChunk, you have to round trip it through Word, before docx4j can 
create a PDF or HTML out of it.) 
To process the w:altChunk elements in a docx, you invoke: 
public WordprocessingMLPackage process(WordprocessingMLPackage srcPackage) 
You pass in a docx containg altChunks, and get a  new docx back which doesn͛t. 
Table of Contents 
The minimal XML docx4j needs to insert into the document for Microsoft Word to then generate a 
TOC (including hyperlinks and associated bookmarks), is: 
<w:p> 
<w:r> 
<w:fldChar w:fldCharType="begin" w:dirty="true"/> 
</w:r> 
<w:r> 
<w:instrText xml:space="preserve"> TOC \o "1-3" \h \z \u </w:instrText> 
</w:r> 
<w:r> 
<w:fldChar w:fldCharType="end"/> 
</w:r> 
</w:p>   
Generating page numbers is a challenge without Word. 
The commercial edition of docx4j includes code to generate/update a TOC, including page numbers, 
based on a basic page layout model.   
Text extraction 
A quick way to extract the text from a docx, is to use 
TextUtils‘   
public static void extractText(Object o, Writer w)
Documents you may be interested
Documents you may be interested