【问题标题】:PDFsharp mm size is smaller when printed打印时 PDFsharp mm 尺寸更小
【发布时间】:2017-11-28 09:39:20
【问题描述】:

我需要在 PDF 文件上打印一个图像,该文件在打印时正好是 80 毫米高。我知道页面大小,我知道我放在 PDF 上的图像的 DPI。但是当我打印出来时,它的尺寸是 78.5 毫米……而且我正在做的任务需要精确。

我从磁盘加载图像,我知道 DPI,我知道像素高度/宽度。我将它加载到 Image 对象中(将垂直和水平 dpi 设置为 300)。然后将其添加到他的 PDF 中。

    public static void SavePdf(Image img, string filename)
        {
            // Create a new PDF document
            PdfDocument document = new PdfDocument();
            document.Info.Title = "Test";

            // Create an empty page
            PdfPage page = document.AddPage();
            page.Width = SharedMethods.MmToPixel(520);
            page.Height = SharedMethods.MmToPixel(110);

            // Get an XGraphics object for drawing
            XGraphics gfx = XGraphics.FromPdfPage(page);

            XImage image = XImage.FromGdiPlusImage(img);

            gfx.DrawImage(image, 0, 0, image.PixelWidth, image.PixelHeight);

            // Save the document...

            document.Save(filename);


        }

图片必须从页面的左上角开始。

但它似乎从顶部开始几毫米,尺寸似乎从 80 毫米减小到 78.5 毫米。

我听说 PDF 的大小调整了 98%,原因是……某些事情。这可能是问题所在,我需要将图像放大到 102% 吗?

注意,我知道我想要的 mm 大小,所以我根据我的 DPI 和我在网上找到的常量将其转换为像素:

 const double milimetresPerInch = 25.4; // as one inch is 25.4 mm
 const double dpi = 300;

 public static int MmToPixel(double mm)
 {
     double pixel = mm * dpi / milimetresPerInch;
     return (int)Math.Round(pixel);
 }

编辑:

我现在正在使用 XUnit.FromMillimeter,但这是否正确?

page.Width = XUnit.FromMillimeter(520);
page.Height = XUnit.FromMillimeter(110);

然后我正在加载图像,它与纸张尺寸(以毫米为单位)相同,如下所示:

XImage image = XImage.FromGdiPlusImage(img);
gfx.DrawImage(image, 0, 0, image.PixelWidth, image.PixelHeight);

对吗?它应该适合整个页面,但我注意到我使用的是像素,但也许我需要使用 FromPixels 或不知何故 FromMillimteres?

【问题讨论】:

  • 打印 PDF 时,实际打印的纸张尺寸是多少?打印(对话框)设置是什么?
  • 纸张是 520 毫米 x 110 毫米的自定义尺寸纸张。打印机对话框的其余设置保留为默认设置。
  • 打印对话框中的缩放比例是如何配置的?
  • 在调用DrawImage 时,您应该使用page.Width 而不是image.PixelWidth(高度类似)。

标签: c# .net image pdf pdfsharp


【解决方案1】:

我听说 PDF 的大小调整了 98%,原因是……某事。

该信息的来源?

打印机通常有非打印区域,现代打印机的每边通常只有几毫米。默认情况下,Adobe Reader 会在打印时缩小页面大小,以使整个页面适合打印区域。使用 Adob​​e Reader 打印时禁用自动缩放。
如果图像从左上角开始,由于非打印区域,部分图像可能会被截断。

Adobe Reader 可以测量 PDF 页面上的项目。因此,您可以轻松验证您的图像是否具有应有的尺寸,这将告诉您打印或将图像嵌入 PDF 是否存在问题。
Adobe Reader 还可以向您显示页面的大小 - 可能页面的 mm 大小与您预期的不同。

您应该使用 PDFsharp 的方法,如Unit.FromMillimeter 来转换单位。您的方法MmToPixel 可能弊大于利。 PDF 页面没有像素,尺寸以磅为单位。

【讨论】:

  • 啊,谢谢。那时可能就是这样。我正在使用免费版的 acrobats PDF 查看器,但似乎无法验证我的盒子确实有 80 毫米高。有没有办法验证这一点?我还会寻找停止调整大小的设置。
  • 我不确定如何使用 Unit.FromMillimeter。 “page.Height = SharedMethods.MmToPixel(110);”这行会怎么样切换到使用内置方法?
  • 我在最初问题的底部添加了一个编辑,并考虑了您的建议。我用来将 mm 转换为像素的函数现在仅在我渲染实际图形时使用。当我将它放在 pdf 上时,我使用的是 XUnit.FromMilimeters,如初始问题编辑中所示。但我被困在图像的位置上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多