我想在winforms中的控件中呈现PDF页面,然后在PDF上移动矩形以识别用户选择的文本字符串。我正在尝试使用WebBrowser控件渲染PDF,但WebBrowser似乎不支持GDI。
任何人都可以建议一种更好的渲染PDF的方法,以便我可以在其上移动矩形。
答案 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