1

在 PDFPrintTest 的示例中进行测试时,我们注意到示例 2 与事件处理程序的示例 1 的行为不正常。

PrintPage 事件处理程序示例 1:

void PrintPage(object sender, PrintPageEventArgs ev)
    {
        Graphics gr = ev.Graphics;
        gr.PageUnit = GraphicsUnit.Inch;

        Rectangle rectPage = ev.PageBounds;         //print without margins
        //Rectangle rectPage = ev.MarginBounds;     //print using margins

        float dpi = gr.DpiX;
        if (dpi > 300) dpi = 300;

        int example = 1;
        bool use_hard_margins = false;

        // Example 1) Print the Bitmap.
        if (example == 1)
        {
            pdfdraw.SetDPI(dpi);
            Bitmap bmp = pdfdraw.GetBitmap(pageitr.Current());
            //bmp.Save("tiger.jpg");

            gr.DrawImage(bmp, rectPage, 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel);
        }

完整的示例代码在这里:https ://www.pdftron.com/pdfnet/samplecode/PDFPrintTest.cs.html

您会注意到bmp.Save("tiger.jpg");注释中的注释,这就是出错的地方。如果我们运行代码并保存 bmp,我们会在 jpg 文件中得到我们需要的内容。但是,gr.DrawImage(bmp, rectPage, 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel);打印一个纯空的 pdf 页面。这是为什么 ?

我们的目标:在某些情况下,我们需要强制打印 40% 灰度的打印作业。Winforms 不支持这一点,我们只能设置灰度,不能指定百分比,所以我们希望截取打印并将输出更改为 40% 灰度,这将我们引向 PdfNet 打印示例。从这些示例中,只有处理程序中的示例 2Graphics gr接受颜色矩阵来为页面设置所需的灰度。

也欢迎任何非 PdfNet 解决方案,但奇怪的是示例代码不能开箱即用。

4

2 回答 2

1

感谢您指出这一点。就像你一样,我不清楚为什么bmp.Save工作正常,但Graphics.DrawImage(bmp,...只显示背景颜色。我怀疑它与传入的其他参数有关Graphics.DrawImage

由于 Bitmap 对象是正确的,因此这个特定问题实际上是一个 .Net 问题,而不是 PDFNet 问题,我目前无法回答。

样本的另一部分运行良好,使用PDFDraw.DrawInRect. 这对你不起作用吗?

于 2017-06-13T22:54:24.333 回答
1

我们让它工作了,显然它在打印到 pdf 时只给出一个白页。完全相同的代码渲染了一个太小的图像,但实际上是打印出来的。我们仍然不完全确定问题出在哪里,但制定了可以正确打印为 pdf 并在打印机上全面打印的新代码。

void PrintPage(object sender, PrintPageEventArgs ev)
    {
        Graphics gr = ev.Graphics;
        gr.PageUnit = GraphicsUnit.Pixel; //this has been changed to Pixel, from Inch.

        float dpi = gr.DpiX;
        //if (dpi > 300) dpi = 300;


        Rectangle rectPage = ev.PageBounds;         //print without margins
        //Rectangle rectPage = ev.MarginBounds;     //print using margins

         float dpi = gr.DpiX;


        int example = 1;
        bool use_hard_margins = false;

        // Example 1) Print the Bitmap.
        if (example == 1)
        {
            pdfdraw.SetDPI(dpi);
            pdfdraw.SetDrawAnnotations(false);
            Bitmap bmp = pdfdraw.GetBitmap(pageitr.Current());



            gr.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel);
        }

`

if (dpi > 300) dpi = 300;这是渲染发送到打印机的太小的图像的主要原因。它还修复了“白色 pdf”问题。其次,我们没有传递rectPage给DrawImage,而是将其替换为:new Rectangle(0, 0, bmp.Width, bmp.Height)

我可以理解发送到打印机的较小尺寸,但为什么它没有拾取任何打印到 pdf 的内容仍不清楚。

虽然最终目标仍然是打印,但使用正常工作的“打印到 pdf”进行调试和测试要容易得多。上面的代码在 2 个单独的项目中工作,所以我假设这确实解决了这个问题。

于 2017-06-14T08:40:52.053 回答