Here we import the pages with odd page numbers of an XPS
document up to page 8, 2 pages per sheet in landscape. The aspect
ratio is preserved and a border is also drawn.
using (Doc doc = new Doc()) {
MyImportOperation importOp = new MyImportOperation(doc);
importOp.Import(Server.MapPath("mypics/AdvancedGraphicsExamples.xps"));
doc.Save(Server.MapPath("xps.pdf"));
}
Using doc As New Doc()
Dim importOp As New MyImportOperation(doc)
importOp.Import(Server.MapPath("mypics/AdvancedGraphicsExamples.xps"))
doc.Save(Server.MapPath("xps.pdf"))
End Using
class MyImportOperation {
private Doc _doc = null;
private double _margin = 10;
private int _pagesAdded = 0;
public MyImportOperation(Doc doc) {
_doc = doc;
_doc.Transform.Rotate(90, _doc.MediaBox.Left, _doc.MediaBox.Bottom);
_doc.Transform.Translate(_doc.MediaBox.Width, 0);
int theID = _doc.GetInfoInt(_doc.Root, "Pages");
_doc.SetInfo(theID, "/Rotate", "90");
}
public void Import(string inPath) {
using (XpsImportOperation op = new XpsImportOperation()) {
op.ProcessingObject += Processing;
op.ProcessedObject += Processed;
op.Import(_doc, inPath);
}
}
public void Processing(object sender, ProcessingObjectEventArgs e) {
if (e.Info.SourceType == ProcessingSourceType.Page && e.Info.PageNumber != null) {
if ((e.Info.PageNumber % 2) == 0)
e.Info.PageNumber++;
if (e.Info.PageNumber >= 8)
e.Info.PageNumber = null;
e.Tag = e.Info.PageNumber;
}
else if (e.Info.SourceType == ProcessingSourceType.PageContent) {
if ((_pagesAdded % 2) == 0)
_doc.Page = _doc.AddPage();
double width = _doc.MediaBox.Height;
double height = _doc.MediaBox.Width;
double scale = Math.Min((width - 4 * _margin) / (2 * e.Info.Width.Value),
(height - 2 * _margin) / e.Info.Height.Value);
double rectWidth = scale * e.Info.Width.Value;
double rectHeight = scale * e.Info.Height.Value;
double distanceX = (width - 2 * rectWidth) / 3;
double distanceY = (height - rectHeight) / 2;
_doc.Rect.SetRect(distanceX + (_pagesAdded % 2) * (distanceX + rectWidth),
distanceY, rectWidth, rectHeight);
e.Info.Handled = true;
_pagesAdded++;
}
}
public void Processed(object sender, ProcessedObjectEventArgs e) {
if (e.Successful) {
PixMap pixmap = e.Object as PixMap;
if (pixmap != null)
pixmap.Compress();
GraphicLayer graphic = e.Object as GraphicLayer;
if (graphic != null) {
_doc.FrameRect();
int pageNumber = (int)e.Tag;
_doc.FontSize = 16;
_doc.TextStyle.HPos = 0.5;
_doc.Rect.Top = _doc.Rect.Bottom - _margin;
_doc.Rect.Bottom = _doc.MediaBox.Bottom;
_doc.AddText(string.Format("Page {0}", pageNumber));
}
}
}
}
Private Class MyImportOperation
Private _doc As Doc = Nothing
Private _margin As Double = 10
Private _pagesAdded As Integer = 0
Public Sub New(doc As Doc)
_doc = doc
_doc.Transform.Rotate(90, _doc.MediaBox.Left, _doc.MediaBox.Bottom)
_doc.Transform.Translate(_doc.MediaBox.Width, 0)
Dim theID As Integer = _doc.GetInfoInt(_doc.Root, "Pages")
_doc.SetInfo(theID, "/Rotate", "90")
End Sub
Public Sub Import(inPath As String)
Using op As New XpsImportOperation()
op.ProcessingObject += Processing
op.ProcessedObject += Processed
op.Import(_doc, inPath)
End Using
End Sub
Public Sub Processing(sender As Object, e As ProcessingObjectEventArgs)
If e.Info.SourceType = ProcessingSourceType.Page AndAlso e.Info.PageNumber <> Nothing Then
If (e.Info.PageNumber Mod 2) = 0 Then
System.Math.Max(System.Threading.Interlocked.Increment(e.Info.PageNumber),e.Info.PageNumber - 1)
End If
If e.Info.PageNumber >= 8 Then
e.Info.PageNumber = Nothing
End If
e.Tag = e.Info.PageNumber
ElseIf e.Info.SourceType = ProcessingSourceType.PageContent Then
If (_pagesAdded Mod 2) = 0 Then
_doc.Page = _doc.AddPage()
End If
Dim width As Double = _doc.MediaBox.Height
Dim height As Double = _doc.MediaBox.Width
Dim scale As Double = Math.Min((width - 4 * _margin) / (2 * e.Info.Width.Value), (height - 2 * _margin) / e.Info.Height.Value)
Dim rectWidth As Double = scale * e.Info.Width.Value
Dim rectHeight As Double = scale * e.Info.Height.Value
Dim distanceX As Double = (width - 2 * rectWidth) / 3
Dim distanceY As Double = (height - rectHeight) / 2
_doc.Rect.SetRect(distanceX + (_pagesAdded Mod 2) * (distanceX + rectWidth), distanceY, rectWidth, rectHeight)
e.Info.Handled = True
System.Math.Max(System.Threading.Interlocked.Increment(_pagesAdded),_pagesAdded - 1)
End If
End Sub
Public Sub Processed(sender As Object, e As ProcessedObjectEventArgs)
If e.Successful Then
Dim pixmap As PixMap = TryCast(e.[Object], PixMap)
If pixmap <> Nothing Then
pixmap.Compress()
End If
Dim graphic As GraphicLayer = TryCast(e.[Object], GraphicLayer)
If graphic <> Nothing Then
_doc.FrameRect()
Dim pageNumber As Integer = DirectCast(e.Tag, Integer)
_doc.FontSize = 16
_doc.TextStyle.HPos = 0.5
_doc.Rect.Top = _doc.Rect.Bottom - _margin
_doc.Rect.Bottom = _doc.MediaBox.Bottom
_doc.AddText(String.Format("Page {0}", pageNumber))
End If
End If
End Sub
End Class