wpf - 如何使用PDFSharp将整页打印到pdf

时间:2016-01-21 14:47:13

标签: c# wpf pdf pdf-generation

所以我想知道如何使用PDFSharp将我的整个WPF页面打印成PDF文件。 我已经看过几篇文章,但我似乎无法弄明白。 我希望pdf看起来像这样: enter image description here

我已经查阅过关于绘制字符串的文章,用线命名。但是,单独创建每一行,字符串和形状对我来说都是一个草率和坏主意。

任何人都可以帮我吗?

文章也将受到赞赏!

提前致谢

2 个答案:

答案 0 :(得分:1)

我想说首先使用RenderTargetBitmap将控件导出到图像,然后使用库将其导出为PDF。

也许这个样本可能有帮助吗?

http://www.techcognition.com/post/Create-PDF-File-From-WPF-Window-using-iTextsharp-1001

使用此library

这里是我使用sucess的Control to Image类(我能够获得复杂UI控件的PNG快照,意味着一个非常深的父子层次结构)

source是一个WPF控件容器(usercontrol,grid,wahtever)。

path是PNG输出文件的完整路径(C:\ Temp \ myImage.png)

public class ControlToImageSnapshot
{
    /// <summary>
    /// Conversion du controle en image PNG
    /// </summary>
    /// <param name="source">Contrôle à exporter</param>
    /// <param name="path">Destination de l'export</param>
    /// <param name="zoom">Taille désirée</param>
    public static void SnapShotPng(FrameworkElement source, string path, double zoom = 1.0)
    {
        try
        {
            var dir = Path.GetDirectoryName(path);
            if (dir != null && !Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }

            RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)source.ActualWidth, (int)source.ActualHeight, 96, 96, PixelFormats.Pbgra32);
            VisualBrush sourceBrush = new VisualBrush(source);


            DrawingVisual drawingVisual = new DrawingVisual();

            DrawingContext drawingContext = drawingVisual.RenderOpen();

            using (drawingContext)
            {

                drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(source.ActualWidth, source.ActualHeight)));
            }
            renderTarget.Render(drawingVisual);

            PngBitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(renderTarget));

            using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write))
            {
                encoder.Save(stream);
            }

            createPdfFromImage(path, @"C:\Temp\myfile.pdf");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
    public static void createPdfFromImage(string imageFile, string pdfFile)
    {
        using (var ms = new MemoryStream())
        {
            var document = new iTextSharp.text.Document(iTextSharp.text.PageSize.LETTER.Rotate(), 0, 0, 0, 0);
            PdfWriter.GetInstance(document, new FileStream(pdfFile, FileMode.Create));
            iTextSharp.text.pdf.PdfWriter.GetInstance(document, ms).SetFullCompression();
            document.Open();

            FileStream fs = new FileStream(imageFile, FileMode.Open);
            var image = iTextSharp.text.Image.GetInstance(fs);
            image.ScaleToFit(document.PageSize.Width, document.PageSize.Height);
            document.Add(image);
            document.Close();

            //open pdf file
            Process.Start("explorer.exe", pdfFile);
        }
    }
}

答案 1 :(得分:0)

对于pdfsharp来说非常简单,你可以为pdf图像传递一个字节数组和pdf,在处理pdfsharp中的图像时,我已经使用了这个函数。

相当自我解释

打开pdf并将图像打开到内存流

获取pdf设置并选择要绘制的页面 我总是将插值设置为假,我使用我正在处理的图像得到更好的结果,如果你的图像中有阴影,则将其设置为真。

然后你要做的就是在pdf上绘制图像并作为内存流返回

    public static byte[] AddImageToPdf(byte[] pdf, byte[] img, double x, double y)
    {
        using (var msPdf = new MemoryStream(pdf))
        {
            using (var msImg = new MemoryStream(img))
            {
                var image = Image.FromStream(msImg);

                var document = PdfReader.Open(msPdf);
                var page = document.Pages[0];
                var gfx = XGraphics.FromPdfPage(page);

                var ximg = XImage.FromGdiPlusImage(image);
                ximg.Interpolate = false;

                gfx.DrawImage(
                    ximg,
                    XUnit.FromCentimeter(x),
                    XUnit.FromCentimeter(y),
                    ximg.PixelWidth * 72 / ximg.HorizontalResolution,
                    ximg.PixelHeight * 72 / ximg.HorizontalResolution);


                using (var msFinal = new MemoryStream())
                {
                    document.Save(msFinal);
                    return msFinal.ToArray();
                }
            }
        }
    }

它的硬编码为pdf中的第1页,如果你愿意,可以轻松扩展以传入页面,生病留给你自己,最后你得到一个包含你的pdf的漂亮字节数组,没有文件需要触及如果您将图像作为内存流从控件中导入并传入,则会进行地面路由。本主题中的另一个答案可以很好地获取控制图像。