2011-03-26 40 views
0

这是我的第一篇文章,我非常沮丧地使用Silverlight,因为我是一个新手。我有三个Silverlight UI(StackPanels基本上)“stkMain1”,“stkMain2”和“stkMain3”。使用SilverPDF的多页PDF导出Silverlight UI

我必须将这三个堆栈面板转换为PDF。我使用silverPDF(我想这还使用iTextSharp的和PDFSharp。)

我已经写了下面的代码:

Private Sub cmdImage_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles cmdImage.Click 
    Dim d As New SaveFileDialog() 
    d.Filter = "PDF file format|*.pdf" 

    ' Save the document... 
    If d.ShowDialog() = True Then 
     stkMain.Children.Clear() 
     stkMain.Children.Add(stkMain1) 

     Dim document As New PdfDocument() 
     Dim page As PdfPage = document.AddPage 
     Dim gfx As XGraphics = XGraphics.FromPdfPage(page) 
     Dim img As ImageTools.ExtendedImage = BillPage1.ToImage 
     Dim mstream As New MemoryStream() 
     Dim encoder As New JpegEncoder() 
     encoder.Encode(img, mstream) 
     mstream.Seek(0, SeekOrigin.Begin) 
     Dim pdfImg As XImage = XImage.FromStream(mstream) 
     gfx.DrawImage(pdfImg, 0, 0) 

    End If 
End Sub 

该做的一切正确的,并给出一个PDF文件的一个页面..精湛输出和竖起大拇指。 现在真正的问题开始:

Private Sub cmdImage_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles cmdImage.Click 
    Dim d As New SaveFileDialog() 
    d.Filter = "PDF file format|*.pdf" 

    ' Save the document... 
    If d.ShowDialog() = True Then 
     stkMain.Children.Clear() 
     stkMain.Children.Add(BillPage1) 

     Dim document As New PdfDocument() 
     Dim page As PdfPage = document.AddPage 
     Dim gfx As XGraphics = XGraphics.FromPdfPage(page) 
     Dim img As ImageTools.ExtendedImage = BillPage1.ToImage 
     Dim mstream As New MemoryStream() 
     Dim encoder As New JpegEncoder() 
     encoder.Encode(img, mstream) 
     mstream.Seek(0, SeekOrigin.Begin) 
     Dim pdfImg As XImage = XImage.FromStream(mstream) 
     gfx.DrawImage(pdfImg, 0, 0) 


     document.Pages.Add() 

     Dim page1 As PdfPage = document.AddPage 
     Dim gfx1 As XGraphics = XGraphics.FromPdfPage(page1) 
     Dim img1 As ImageTools.ExtendedImage = BillPage2.ToImage 
     Dim mstream1 As New MemoryStream() 
     Dim encoder1 As New JpegEncoder() 
     encoder1.Encode(img1, mstream1) 
     mstream1.Seek(0, SeekOrigin.Begin) 
     Dim pdfImg1 As XImage = XImage.FromStream(mstream1) 
     gfx1.DrawImage(pdfImg1, 0, 0) 


     document.Save(d.OpenFile()) 
    End If 
End Sub 

现在,这造成两页,我得到一个扰码输出时,stackpanels的内容相互重叠。

如何解决这个?我需要绝对帮助。该项目将于2011年3月26日(星期一)递交。

在此先感谢 拉维

+0

你能解释一下你的输出是什么样子多一点?我不太了解Silverlight,但它看起来像是将UI元素转换为元素并将其添加到PDF中的单个页面,然后使用下一个UI元素重复该元素,对吗?第一页好吗?这只是第二页看起来不好吗?什么重叠什么?这是PDF还是图像创建中的问题?你有没有尝试手动将图像保存到磁盘,看看他们是否是他们的? – 2011-03-26 18:30:08

回答

1

试试这个:

If d.ShowDialog() = True Then 
    Dim document As New PdfDocument() 
    Dim page As PdfPage = document.AddPage 
    Dim pdfImg As XImage = DrawUI(stkMain1) 
    gfx.DrawImage(pdfImg, 20, 20) 
    page = document.AddPage() 
    gfx = XGraphics.FromPdfPage(page) 
    pdfImg = DrawUI(stkMain2) 
    page = document.AddPage() 
    gfx = XGraphics.FromPdfPage(page) 
    gfx.DrawImage(pdfImg, 20, 20) 
    pdfImg = DrawUI(stkMain3) 
    gfx.DrawImage(pdfImg, 20, 20) 
    document.Save(d.OpenFile()) 
End If 


Private Function DrawUI(ByVal oControl As Object) As XImage 
    Dim img As ImageTools.ExtendedImage = ImageExtensions.ToImage(oControl) 
    Dim mstream As New MemoryStream() 
    Dim encoder As New JpegEncoder() 
    encoder.Encode(img, mstream) 
    mstream.Seek(0, SeekOrigin.Begin) 
    Dim pdfImg As XImage = XImage.FromStream(mstream) 
    Return pdfImg 
End Function