Pdfnet打印样本不工作

问题描述:

在从PDFPrintTest样本中进行测试时,我们注意到示例2与事件处理程序的示例1相结合的行为不正确。Pdfnet打印样本不工作

例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 Print样本。从这些示例中,处理程序中只有示例2具有Graphics gr,它接受用于设置所需页面中灰度级的颜色矩阵。

任何非PdfNet解决方案都是受欢迎的,但样例代码不能正常工作仍然很奇怪。

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

+0

太好了,谢谢。我们将审查和更新我们的示例代码。 – Ryan

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

由于该位图对象是正确的,那么这个特定的问题是一个真正的.Net问题,而不是一个PDFNet问题,我目前无法回答。

样本的其他部分运行正常,使用PDFDraw.DrawInRect。这不适合你吗?

+0

我们现在成功打印页面,奇怪的是,它并没有'打印到pdf'。尽管如此,为了测试目的而实际打印却有点麻烦。 我们现在有我们需要的东西,但它为什么只显示'print to pdf'中的白页仍然是一个谜。事实上,这可能是一个.NET问题。 –

+0

瑞恩,我添加了一个代码片段,为我们工作,作为答案。希望你能从中得到一些东西,以防你想改变你的示例代码。 –

+0

如果您有新的或单独的问题,请发布新的SO问题。 – Ryan