如何在PDF页面上绘制矩形?

时间:2014-01-08 12:40:56

标签: vb.net winforms pdf

我想在winforms中的控件中呈现PDF页面,然后在PDF上移动矩形以识别用户选择的文本字符串。我正在尝试使用WebBrowser控件渲染PDF,但WebBrowser似乎不支持GDI。

任何人都可以建议一种更好的渲染PDF的方法,以便我可以在其上移动矩形。

2 个答案:

答案 0 :(得分:2)

如果您想继续使用WebBrowser控件,您可以使用透明表单移动并调整基础表单的大小。

创建mainform Form1并向其添加Webbrowsercontrol。对于此示例,将.Dock设置为All。 添加第二个表单,Form2,上面没有任何内容。

在Form1中,您显示Form2并在表单移动或调整大小时移动它。

Public Class Form1
Private Sub MoveForm2()
    Dim crpos As Point = Me.PointToClient(Me.DesktopLocation)
    With Form2
        .DesktopLocation = New Point(Me.DesktopLocation.X - crpos.X, Me.DesktopLocation.Y - crpos.Y)
        .WindowState = Me.WindowState
        .Size = Me.ClientSize
    End With
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    WebBrowser1.Navigate("www.google.com")
    MoveForm2()
    Form2.Show(Me)
End Sub
Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize
    MoveForm2()
End Sub
Private Sub Form1_Move(sender As Object, e As EventArgs) Handles MyBase.Move
    MoveForm2()
End Sub
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    MoveForm2()
End Sub
End Class

在Form2中,您使用API​​调用来点击Form2(从VB.net Click through form翻录)。

在这里,您还可以直接在表格上绘图。使用TransparencyKey和BackColor使其透明。

Imports System.Runtime.InteropServices
Public Class Form2
<DllImport("user32.dll", EntryPoint:="GetWindowLong")> Public Shared Function GetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Integer
End Function
<DllImport("user32.dll", EntryPoint:="SetWindowLong")> Public Shared Function SetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer
End Function

Private Sub Form2_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
    'Draw rectangles here
    Using g As Graphics = Me.CreateGraphics
        g.DrawRectangle(Pens.Red, 100, 100, 100, 100)
    End Using
End Sub


Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.BackColor = Color.Pink
    Me.TransparencyKey = Color.Pink
    Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    Dim InitialStyle As Integer
    InitialStyle = GetWindowLong(Me.Handle, -20)
    SetWindowLong(Me.Handle, -20, InitialStyle Or &H80000 Or &H20) 'Makes the window "click-throughable"
End Sub

End Class

这当然是一个相当肮脏的黑客,但如果你只是想自己移动矩形它应该工作得很好。你必须根据自己的需要调整这个例子。

答案 1 :(得分:-2)

此解决方案可能适用于以下两种情况:
1-如果您自己生成PDF文件,并且愿意切换到PDFSharp以生成文件 2-如果您没有生成输入文件,但可以显示包含要显示的矩形的修改版本。

我使用PDFsharp。是一个用于处理PDF的开源.NET库

http://www.pdfsharp.com/PDFsharp/

加了: 的 图像 图形对象遵循.Net框架的设计模式。使用一组函数,您可以在PDF页面以及System.Drawing.Graphics对象上绘制。您的应用程序可以在窗口,打印机或PDF文档中呈现其输出。

直线,折线,圆弧,Bézier样条,规范样条 矩形,圆角矩形,椭圆,多边形,馅饼,封闭的样条线,路径

PDFsharp是一个开源库,可以从任何.NET语言轻松创建PDF文档。 相同的绘图程序可用于创建PDF文档,在屏幕上绘图或将输出发送到任何打印机。

PDFsharp精彩集锦

从任何.Net语言动态创建PDF文档

易于理解的对象模型来撰写文档

在PDF页面以及窗口或打印机上绘图的一个源代码

修改,合并和拆分现有PDF文件

具有透明度的图像(彩色遮罩,单色遮罩,alpha遮罩)

从头开始全新设计,完全用C#编写

PDFsharp功能

主要特点

从任何.Net语言动态创建PDF文档

易于理解的对象模型来撰写文档

在PDF页面以及窗口或打印机上绘图的一个源代码

修改,合并和拆分现有PDF文件

具有透明度的图像(彩色遮罩,单色遮罩,alpha遮罩)

从头开始全新设计,完全用C#编写

图形类适用于.Net

可以使用GDI +或WPF