如何调整PDF文档的大小以适合位图

时间:2013-05-14 18:44:07

标签: c# windows graphics bitmap pdfsharp

(我正在使用PDF Sharp)

我有一些位图,每个位图我都会创建一个新的PDF页面。问题是我的pdf页面没有足够的高度来包含整个Bitmap,所以我丢失了一部分Bitmap。

调整pdf页面大小的最佳方法是什么,以便整个Bitmap适合那个PDF页面?

  public static PdfDocument GetPDF(List<Bitmap> pages, bool makeFit = false)
    {
        using (var doc = new PdfDocument())
        {
            for (byte i = 0; i < pages.Count(); i++)
            {
                PdfPage oPage = new PdfPage();
                doc.Pages.Add(oPage);

                using (var xgr = XGraphics.FromPdfPage(oPage))
                {
                    using (var bm = pages[i])
                    {
                        using (var img = XImage.FromGdiPlusImage(bm))
                        {
                            xgr.DrawImage(img, 0, 0);
                        }
                    }
                }
            }
            return doc;
        }
    }

我确实尝试在此位置设置尺寸

 xgr.DrawImage(img, 0, 0);

但这使得Bitmap更大而不是PDF页面。

我可能需要有人简单地指出将位图保存到PDF页面的概念,然后给出一个简单的例子说明它是如何完成的。

我已经查看了PDF Sharp的一些帮助文件,并且它们并不容易掌握。

我希望有人能告诉我如何以最简单的方式解决这个问题。我需要做的就是将位图保存到PDF页面,并确保已保存到PDF页面的位图完全可见。

谢谢!

Snapshot shows that the overflow of the Bitmap is not visible

------------------------------------------ EDIT ---- --------------------------------

我添加了更新版本,左侧的快照是在浏览器中呈现的原始.png图像,右侧的快照是呈现PDF的浏览器。

以下是更新后的代码:

 public static PdfDocument GetPDF(List<Bitmap> pages, bool makeFit = false)
    {
        using (var doc = new PdfDocument())
        {
            for (byte i = 0; i < pages.Count(); i++)
            {
                PdfPage oPage = new PdfPage();
                doc.Pages.Add(oPage);

                if (makeFit)
                {
                    XSize size = new XSize(pages[i].Width, pages[i].Height);
                    oPage.Height = size.Height;
                    oPage.Width = size.Width;
                }

                using (var xgr = XGraphics.FromPdfPage(oPage))
                {
                    using (var bm = pages[i])
                    {
                        using (var img = XImage.FromGdiPlusImage(bm))
                        {
                            xgr.DrawImage(img, 0, 0);
                        }
                    }
                }
            }
            return doc;
        }
    }

----更新图片------------

enter image description here

------------------------------最后编辑有效------------- ---------------

我所做的是将PDF页面的大小调整为位图,然后将位图绘制到页面上,并将位图大小调整为PDF页面大小-5px。

      public static PdfDocument GetPDF(List<Bitmap> pages, bool makeFit = false)
    {
        XSize size = new XSize(0, 0);
        using (var doc = new PdfDocument())
        {
            for (byte i = 0; i < pages.Count(); i++)
            {
                PdfPage oPage = new PdfPage();
                doc.Pages.Add(oPage);

                if (makeFit)
                {
                    size = new XSize(pages[i].Width, pages[i].Height);
                    oPage.Height = size.Height;
                    oPage.Width = size.Width;
                }

                using (var xgr = XGraphics.FromPdfPage(oPage))
                {
                    using (var bm = pages[i])
                    {
                        using (var img = XImage.FromGdiPlusImage(bm))
                        {
                            if (makeFit)
                            {
                                xgr.DrawImage(img, 0, 0, size.Width - 5, size.Height - 5);
                            }
                            else
                            {
                                xgr.DrawImage(img, 0, 0);
                            }
                        }
                    }
                }
            }
            return doc;
        }
    }

- 拍摄照片显示它们产生的视图几乎相同---------

enter image description here

2 个答案:

答案 0 :(得分:1)

也许这就是你要找的东西: http://www.pdfsharp.net/wiki/PageSizes-sample.ashx

特别是,顶部的这个注释:“您可以使用”宽度“和”高度“属性将页面大小设置为任意大小。”

即。

oPage.Width = ...
oPage.Height = ...

答案 1 :(得分:0)

有点晚了,你可以这样做。

for (byte i = 0; i < pages.Count(); i++)
        {
            PdfPage oPage = new PdfPage();
            doc.Pages.Add(oPage);

            using (var xgr = XGraphics.FromPdfPage(oPage))
            {
                using (var bm = pages[i])
                {
                    using (var img = XImage.FromGdiPlusImage(bm))
                    {
                        doc.Pages[i].Width = XUnit.FromPoint(ximg.Size.Width);
                        doc.Pages[i].Height = XUnit.FromPoint(ximg.Size.Height);

                        xgr.DrawImage(ximg, 0, 0, img.Size.Width, img.Size.Height);
                    }
                }
            }
        }