This example shows how to use the FromContentStream function to
parse and display a PDF content stream.
var sb = new StringBuilder();
using (var doc = new Doc()) {
doc.Read("../Rez/spaceshuttle.pdf");
var page = doc.ObjectSoup[doc.Page] as Page;
var array = ArrayAtom.FromContentStream(page.GetContentData());
int indent = 0;
var indentPlus = new HashSet<string>([ "q", "BT" ]);
var indentMinus = new HashSet<string>(["Q", "ET" ]);
var items = OpAtom.Find(array);
int index = 0;
foreach (var pair in items) {
string op = ((OpAtom)array[pair.Item2]).Text;
// add indent to code
if (indentMinus.Contains(op))
indent--;
for (int i = 0; i < indent; i++)
sb.Append(" ");
// write out the operators
for (int i = index; i <= pair.Item2; i++) {
if (i != index)
sb.Append(" ");
var item = array[i];
// we write arrays out individually so that
// we can override default cr lf behavior
var itemArray = item as ArrayAtom;
if (itemArray != null) {
int n = itemArray.Count;
sb.Append("[");
for (int j = 0; j < n; j++) {
sb.Append(itemArray[j].ToString());
if (j != n - 1)
sb.Append(" ");
}
sb.Append("]");
}
else {
sb.Append(item.ToString());
}
}
sb.AppendLine();
if (indentPlus.Contains(op))
indent++;
index = pair.Item2 + 1;
}
// write out any atoms that are left over
for (int i = index; i < array.Count; i++) {
sb.Append(" ");
sb.Append(array[i].ToString());
}
}
using (var doc = new Doc()) {
doc.Font = doc.AddFont("Courier");
doc.Rect.Inset(20, 20);
doc.AddText(sb.ToString());
doc.Save("PageContents.pdf");
}