所以我想知道如何使用PDFSharp将我的整个WPF页面打印成PDF文件。 我已经看过几篇文章,但我似乎无法弄明白。 我希望pdf看起来像这样:
我已经查阅过关于绘制字符串的文章,用线命名。但是,单独创建每一行,字符串和形状对我来说都是一个草率和坏主意。
任何人都可以帮我吗?
文章也将受到赞赏!
提前致谢
答案 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的漂亮字节数组,没有文件需要触及如果您将图像作为内存流从控件中导入并传入,则会进行地面路由。本主题中的另一个答案可以很好地获取控制图像。