2016-01-21 2 views
1

Так что я хочу знать, как распечатать всю мою страницу WPF в PDF-файле с помощью PDFSharp. Я уже смотрел несколько статей, но я не могу понять, как это понять. Я хочу PDF выглядеть примерно так: enter image description herewpf - как распечатать всю страницу в pdf с помощью PDFSharp

Я уже смотрел на статьи о рисовании строки, строки имя его. Но создание каждой строки, строки и формы индивидуально выглядит как неряшливая и плохая идея для меня.

Может ли кто-нибудь помочь мне с этим?

Статьи также будут оценены!

Заранее спасибо

ответ

1

Я хотел бы сказать сначала экспортировать свой контроль на изображение с RenderTargetBitmap и затем использовать библиотеку, чтобы экспортировать его в PDF.

Возможно, этот образец может помочь?

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

С этим library

Здесь его Контроль в классе изображения я использую с Sucess (я могу получить PNG снимок сложных элементов управления пользовательского интерфейса, подразумевающие очень глубокий родитель-ребенок иерархия)

source - это контейнер управления WPF (пользовательский контроль, сетка, вахтевер).

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); 
     } 
    } 
} 
+0

Excidental upvote, извините! Этот код не работает в проекте, хотя у меня есть iTextSharp, мне не нравится эта библиотека.Он дает ошибку: SaveAsPng (GetImage (GridForm), sImagePath); – user5730942

+0

Ну, тогда проблема возникает из метода генерации самого изображения, потому что функция PDF работает отлично для меня, не касаясь одной строки. – Bruno

+0

См. Мой отредактированный ответ. Я опубликовал полный рабочий образец управления моментальным снимком для PNG, а затем от PNG до PDF – Bruno

0

Для PDFsharp его довольно легко, вы можете передать в массив байтов для изображения PDF и PDF, я использовал эту функцию довольно много, имея дело с изображениями в pdfsharp.

довольно самоуправления пояснительная

Открыть PDF и изображения в MemoryStream

Получить настройки PDF и выбрать страницу, чтобы нарисовать на Я всегда установить интерполировать ложь, я получаю лучшие результаты с видом изображений, которые я Я имею дело с, если у вас есть затенение в вашем изображении, установите значение true.

тогда все ваши осталось сделать, это нарисовать изображение на PDF и вернуться в MemoryStream

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(); 
       } 
      } 
     } 
    } 

его зашиты на странице 1 в формате PDF, легко расширяемый проходить в страницах, если вы хотите, плохо отпуск что в качестве упражнения для себя, в конце вы получите хороший массив байтов, содержащий ваш pdf-файл, никакие файлы не должны касаться земли, если вы импортируете свое изображение в качестве запоминающего элемента из своего контроля и передаете его. Другой ответ в этом разделе хороший способ получить контрольный образ.

Смежные вопросы