【问题标题】:Pdfnet Print sample not workingPdfnet 打印示例不起作用
【发布时间】:2017-06-09 11:52:00
【问题描述】:

在测试来自 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 解决方案,但示例代码无法开箱即用仍然很奇怪。

【问题讨论】:

    标签: c# winforms printing pdftron pdfnet


    【解决方案1】:

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

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

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

    【讨论】:

    • 我们现在成功地打印了页面,奇怪的是,它没有使用'print to pdf'。不过,为了测试目的而实际打印有点麻烦。我们现在有了我们需要的东西,但为什么它只在“打印到pdf”中显示一个白页仍然是个谜。事实上,这可能是一个 .NET 问题。
    • Ryan,我添加了一个对我们有用的代码 sn-p 作为答案。希望您能从中得到一些东西,以防您想更改示例代码。
    • 如果您有新的或单独的问题,请发布新的 SO 问题。
    【解决方案2】:

    我们让它工作了,显然它在打印到 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 个单独的项目中工作,所以我假设这确实解决了这个问题。

    【讨论】:

    • 太好了,谢谢。我们将审查并更新我们的示例代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 2013-04-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2015-04-12
    相关资源
    最近更新 更多