Pdfnet 打印示例不起作用

Pdfnet Print sample not working

在测试来自 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 打印示例。从这些示例中,处理程序中只有示例 2 具有 Graphics gr,它接受颜色矩阵来为页面设置所需的灰度。

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

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

的其他参数有关

既然 Bitmap 对象是正确的,那么这个特定问题实际上是一个 .Net 问题而不是 PDFNet 问题,我目前无法回答。

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

我们让它工作了,显然它在打印为 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; 这是导致发送到打印机的图像太小的罪魁祸首。它还修复了 'white pdf' 问题。 其次,我们没有将rectPage传递给DrawImage,而是将其替换为:new Rectangle(0, 0, bmp.Width, bmp.Height).

我可以理解发送到打印机的较小尺寸,但仍然不清楚为什么它没有选择任何东西来打印成 pdf。

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