如何解决如何使用 itext7 从 vb.net 中的 pdf 中提取矩形?
我想从 pdf 中提取矩形及其位置和填充颜色。如果这里有人对在 vb.net 中使用 itext7 从 pdf 中提取矩形形状有一些想法,请帮助我
解决方法
正如评论中所证明的那样,OP 感兴趣的形式是矢量图形,但不仅是矩形,而且基本上是任意形状。因此,此答案演示了如何使用 vb.net 提取矢量图形路径及其使用(笔触/填充/...)。
对于从 PDF 中提取数据,iText 7 提供了一个框架,该框架遵循 PDF 内容流中的说明并相应地触发事件。因此,要提取路径,您必须首先实现一个事件侦听器(实现 iText IEventListener
接口)。然后,此实现只需要选择所需的事件(使用 EventType.RENDER_PATH
)并从给定的 PathRenderInfo
事件数据对象中提取所需的信息。
以下示例事件侦听器类只是将路径信息打印到控制台:
Public Class PathListener
Implements IEventListener
Public Sub EventOccurred(data As IEventData,type As EventType) Implements IEventListener.EventOccurred
If type = EventType.RENDER_PATH Then
Dim PathRenderInfo As PathRenderInfo = CType(data,PathRenderInfo)
Dim OperationData = GetOperationData(PathRenderInfo)
Dim PathData = GetPathData(PathRenderInfo)
Console.WriteLine("{1} - {0}",OperationData,PathData)
End If
End Sub
Public Function GetSupportedEvents() As ICollection(Of EventType) Implements IEventListener.GetSupportedEvents
Return Nothing
End Function
Function GetOperationData(PathRenderInfo As PathRenderInfo) As String
Dim OperationBuilder As New StringBuilder
If PathRenderInfo.GetOperation = PathRenderInfo.NO_OP Then
OperationBuilder.Append("Invisible")
End If
If (PathRenderInfo.GetOperation And PathRenderInfo.STROKE) = PathRenderInfo.STROKE Then
OperationBuilder.Append("Stroked with ").Append(GetColorData(PathRenderInfo.GetStrokeColor))
If (PathRenderInfo.GetOperation And PathRenderInfo.FILL) = PathRenderInfo.FILL Then
OperationBuilder.Append(" and ")
End If
End If
If (PathRenderInfo.GetOperation And PathRenderInfo.FILL) = PathRenderInfo.FILL Then
OperationBuilder.Append("Filled with ").Append(GetColorData(PathRenderInfo.GetFillColor))
End If
If (PathRenderInfo.IsPathModifiesClippingPath) Then
OperationBuilder.Append(",clipping")
End If
Return OperationBuilder.ToString
End Function
Function GetColorData(Color As Color) As String
Dim ColorBuilder As New StringBuilder
If TypeOf Color Is CalGray Then
ColorBuilder.Append("CalGray")
ElseIf TypeOf Color Is CalRgb Then
ColorBuilder.Append("CalRGB")
ElseIf TypeOf Color Is DeviceCmyk Then
ColorBuilder.Append("DeviceCmyk")
ElseIf TypeOf Color Is DeviceGray Then
ColorBuilder.Append("DeviceGray")
ElseIf TypeOf Color Is DeviceN Then
ColorBuilder.Append("DeviceN")
ElseIf TypeOf Color Is DeviceRgb Then
ColorBuilder.Append("DeviceRgb")
ElseIf TypeOf Color Is IccBased Then
ColorBuilder.Append("IccBased")
ElseIf TypeOf Color Is Indexed Then
ColorBuilder.Append("Indexed")
ElseIf TypeOf Color Is Lab Then
ColorBuilder.Append("Lab")
ElseIf TypeOf Color Is PatternColor Then
Return "PatternColor(special)"
ElseIf TypeOf Color Is Separation Then
ColorBuilder.Append("Separation")
End If
ColorBuilder.Append("(").Append(String.Join(",",Color.GetColorValue)).Append(")")
Return ColorBuilder.ToString
End Function
Function GetPathData(PathRenderInfo As PathRenderInfo) As String
Dim CurrentTransformation = PathRenderInfo.GetCtm
Dim PathBuilder As New StringBuilder
Dim FirstSubPath = True
For Each SubPath In PathRenderInfo.GetPath.GetSubpaths
If FirstSubPath Then
FirstSubPath = False
PathBuilder.Append("Path ")
ElseIf Not (SubPath.IsEmpty Or SubPath.GetSegments.Count = 0) Then
PathBuilder.Append(" and ")
End If
Dim FirstShape = True
For Each Shape In SubPath.GetSegments
If FirstShape Then
FirstShape = False
PathBuilder.Append("from ").Append(GetPointData(Shape.GetBasePoints.First,CurrentTransformation))
Else
PathBuilder.Append(",")
End If
If TypeOf Shape Is Line Then
PathBuilder.Append(" line to ").Append(GetPointData(Shape.GetBasePoints.Last,CurrentTransformation))
ElseIf TypeOf Shape Is BezierCurve Then
PathBuilder.Append(" curve via ").Append(GetPointData(Shape.GetBasePoints(1),CurrentTransformation))
PathBuilder.Append(" and ").Append(GetPointData(Shape.GetBasePoints(2),CurrentTransformation))
PathBuilder.Append(" to ").Append(GetPointData(Shape.GetBasePoints(3),CurrentTransformation))
End If
Next
If SubPath.IsClosed Then
PathBuilder.Append(" (closed)")
End If
Next
Return PathBuilder.ToString
End Function
Function GetPointData(Point As Point,CurrentTransformation As Matrix) As String
Dim Transformed = CurrentTransformation.Multiply(New Matrix(Point.GetX,Point.GetY))
Return String.Format(CultureInfo.InvariantCulture,"({0},{1})",Transformed.Get(Matrix.I31),Transformed.Get(Matrix.I32))
End Function
End Class
使用此事件侦听器,您可以检查文档页面:
Using PdfDocument As New PdfDocument(New PdfReader(...))
Dim PathListener As New PathListener
Dim PdfCanvasProcessor As New PdfCanvasProcessor(PathListener)
For page As Integer = 1 To PdfDocument.GetNumberOfPages
PdfCanvasProcessor.ProcessPageContent(PdfDocument.GetPage(page))
Next
End Using
输出可能如下所示:
Path from (51.2,723.57) line to (512.17,723.57),line to (512.17,736.97),line to (51.2,736.97) (closed) - Invisible,clipping
Path from (108.6,516.6) curve via (108.6,569.29) and (160.18,612) to (223.8,612),curve via (287.42,612) and (339,569.29) to (339,516.6),curve via (339,463.91) and (287.42,421.2) to (223.8,421.2),curve via (160.18,421.2) and (108.6,463.91) to (108.6,516.6) (closed) - Filled with DeviceRgb(0.31,0.506,0.741)
Path from (174.89,545.13) curve via (174.89,550.62) and (180.27,555.07) to (186.89,555.07),curve via (193.52,555.07) and (198.89,550.62) to (198.89,545.13),curve via (198.89,539.64) and (193.52,535.19) to (186.89,535.19),curve via (180.27,535.19) and (174.89,539.64) to (174.89,545.13) (closed) and from (248.71,545.13) curve via (248.71,550.62) and (254.08,555.07) to (260.71,curve via (267.33,555.07) and (272.71,550.62) to (272.71,curve via (272.71,539.64) and (267.33,535.19) to (260.71,curve via (254.08,535.19) and (248.71,539.64) to (248.71,545.13) (closed) - Filled with DeviceRgb(0.251,0.408,0.596)
Path from (174.89,545.13) (closed) - Stroked with DeviceRgb(0.22,0.365,0.541)
Path from (161.36,475) curve via (202.99,451.32) and (244.56,451.32) to (286.09,475) - Stroked with DeviceRgb(0.22,0.541)
Path from (108.6,516.6) (closed) - Stroked with DeviceRgb(0.22,0.541)
Path from (51.2,565.15) line to (512.17,565.15),578.55),578.55) (closed) - Invisible,clipping
Path from (147.8,556.2) curve via (147.8,608.89) and (199.38,651.6) to (263,651.6),curve via (326.62,651.6) and (378.2,608.89) to (378.2,556.2),curve via (378.2,503.51) and (326.62,460.8) to (263,460.8),curve via (199.38,460.8) and (147.8,503.51) to (147.8,556.2) (closed) - Filled with DeviceRgb(0.31,0.741)
Path from (214.09,584.73) curve via (214.09,590.22) and (219.47,594.67) to (226.09,594.67),curve via (232.72,594.67) and (238.09,590.22) to (238.09,584.73),curve via (238.09,579.24) and (232.72,574.79) to (226.09,574.79),curve via (219.47,574.79) and (214.09,579.24) to (214.09,584.73) (closed) and from (287.91,584.73) curve via (287.91,590.22) and (293.28,594.67) to (299.91,curve via (306.53,594.67) and (311.91,590.22) to (311.91,curve via (311.91,579.24) and (306.53,574.79) to (299.91,curve via (293.28,574.79) and (287.91,579.24) to (287.91,584.73) (closed) - Filled with DeviceRgb(0.251,0.596)
Path from (214.09,584.73) (closed) - Stroked with DeviceRgb(0.22,0.541)
Path from (200.56,514.6) curve via (242.19,490.92) and (283.76,490.92) to (325.29,514.6) - Stroked with DeviceRgb(0.22,0.541)
Path from (147.8,556.2) (closed) - Stroked with DeviceRgb(0.22,0.541)
Path from (103,398.43) line to (487,398.43),line to (487,605.83),line to (103,605.83) (closed) - Filled with DeviceRgb(0.31,0.741)
Path from (103,605.83) (closed) - Stroked with DeviceGray(0.525)
Path from (229.4,344.2) curve via (229.4,363.31) and (246.59,378.8) to (267.8,378.8),curve via (289.01,378.8) and (306.2,363.31) to (306.2,344.2),curve via (306.2,325.09) and (289.01,309.6) to (267.8,309.6),curve via (246.59,309.6) and (229.4,325.09) to (229.4,344.2) (closed) - Filled with DeviceRgb(0.31,0.741)
Path from (229.4,344.2) (closed) - Stroked with DeviceRgb(0.22,0.541)
Path from (237.4,256.57) line to (266.74,256.57),line to (275.8,283),line to (284.86,line to (314.2,line to (290.47,240.23),line to (299.53,213.8),230.14),line to (252.07,line to (261.13,240.23) (closed) - Filled with DeviceRgb(0.31,0.741)
Path from (237.4,240.23) (closed) - Stroked with DeviceRgb(0.22,0.541)
Path from (163,432.4) curve via (163,485.09) and (216.9,527.8) to (283.4,527.8),curve via (349.9,527.8) and (403.8,485.09) to (403.8,432.4),curve via (403.8,379.71) and (349.9,337) to (283.4,337),curve via (216.9,337) and (163,379.71) to (163,432.4) (closed) - Filled with DeviceRgb(0.31,0.741)
Path from (232.29,460.93) curve via (232.29,466.42) and (237.9,470.87) to (244.83,470.87),curve via (251.75,470.87) and (257.37,466.42) to (257.37,460.93),curve via (257.37,455.44) and (251.75,450.99) to (244.83,450.99),curve via (237.9,450.99) and (232.29,455.44) to (232.29,460.93) (closed) and from (309.43,460.93) curve via (309.43,466.42) and (315.05,470.87) to (321.97,curve via (328.9,470.87) and (334.51,466.42) to (334.51,curve via (334.51,455.44) and (328.9,450.99) to (321.97,curve via (315.05,450.99) and (309.43,455.44) to (309.43,460.93) (closed) - Filled with DeviceRgb(0.251,0.596)
Path from (232.29,460.93) (closed) - Stroked with DeviceRgb(0.22,0.541)
Path from (218.14,390.8) curve via (261.65,367.12) and (305.1,367.12) to (348.51,390.8) - Stroked with DeviceRgb(0.22,432.4) (closed) - Stroked with DeviceRgb(0.22,60.025) line to (420.15,60.025),line to (420.15,736.975),736.975) (closed) - Invisible,clipping
Path from (255.48,564.55) line to (368.53,564.55),line to (368.53,579.15),line to (255.48,579.15) (closed) - Filled with DeviceRgb(0.31,0.741)
Path from (255.48,550.13) line to (368.53,550.13),564.755),564.755) (closed) - Filled with DeviceRgb(0.863,0.902,0.945)
Path from (255.48,521.32) line to (368.53,521.32),535.92),535.92) (closed) - Filled with DeviceRgb(0.863,492.52) line to (368.53,492.52),507.12),507.12) (closed) - Filled with DeviceRgb(0.863,463.73) line to (368.53,463.73),478.33),478.33) (closed) - Filled with DeviceRgb(0.863,434.9) line to (368.53,434.9),449.525),449.525) (closed) - Filled with DeviceRgb(0.863,406.1) line to (368.53,406.1),420.7),420.7) (closed) - Filled with DeviceRgb(0.863,0.945)
Path from (51.2,565.15) line to (420.15,clipping
Path from (49.2,57.825) line to (422.35,57.825),line to (422.35,738.975),line to (49.2,738.975) (closed) - Invisible,clipping
Path from (255.18,579.45) line to (255.18,405.8) - Stroked with DeviceRgb(0.584,0.702,0.843)
Path from (255.08,405.7) line to (256.08,405.7),line to (256.08,579.55),line to (255.08,579.55) (closed) - Filled with DeviceRgb(0.584,0.843)
Path from (368.02,578.45) line to (368.02,0.843)
Path from (367.93,405.7) line to (368.93,line to (368.93,line to (367.93,578.55) (closed) - Filled with DeviceRgb(0.584,0.843)
Path from (256.18,579.45) line to (368.83,579.45) - Stroked with DeviceRgb(0.584,0.843)
Path from (256.08,578.55) line to (368.93,565.05) line to (368.83,565.05) - Stroked with DeviceRgb(0.584,564.15) line to (368.93,564.15),565.15) (closed) - Filled with DeviceRgb(0.584,550.63) line to (368.83,550.63) - Stroked with DeviceRgb(0.584,549.72) line to (368.93,549.72),550.72),550.72) (closed) - Filled with DeviceRgb(0.584,536.22) line to (368.83,536.22) - Stroked with DeviceRgb(0.584,535.33) line to (368.93,535.33),536.33),536.33) (closed) - Filled with DeviceRgb(0.584,521.82) line to (368.83,521.82) - Stroked with DeviceRgb(0.584,520.92) line to (368.93,520.92),521.92),521.92) (closed) - Filled with DeviceRgb(0.584,507.42) line to (368.83,507.42) - Stroked with DeviceRgb(0.584,506.52) line to (368.93,506.52),507.52),507.52) (closed) - Filled with DeviceRgb(0.584,493.02) line to (368.83,493.02) - Stroked with DeviceRgb(0.584,492.13) line to (368.93,492.13),493.13),493.13) (closed) - Filled with DeviceRgb(0.584,478.63) line to (368.83,478.63) - Stroked with DeviceRgb(0.584,477.73) line to (368.93,477.73),478.73),478.73) (closed) - Filled with DeviceRgb(0.584,464.23) line to (368.83,464.23) - Stroked with DeviceRgb(0.584,463.32) line to (368.93,463.32),464.32),464.32) (closed) - Filled with DeviceRgb(0.584,449.82) line to (368.83,449.82) - Stroked with DeviceRgb(0.584,448.9) line to (368.93,448.9),449.925),449.925) (closed) - Filled with DeviceRgb(0.584,435.4) line to (368.83,435.4) - Stroked with DeviceRgb(0.584,434.5) line to (368.93,434.5),435.5),435.5) (closed) - Filled with DeviceRgb(0.584,421) line to (368.83,421) - Stroked with DeviceRgb(0.584,420.1) line to (368.93,420.1),421.1),421.1) (closed) - Filled with DeviceRgb(0.584,406.6) line to (368.83,406.6) - Stroked with DeviceRgb(0.584,406.7),406.7) (closed) - Filled with DeviceRgb(0.584,0.843)
Path from (280.6,359.3) line to (287.93,380.62),line to (307.13,393.8),line to (330.87,line to (350.07,line to (357.4,359.3),337.98),324.8),line to (287.93,337.98) (closed) - Filled with DeviceRgb(0.31,0.741)
Path from (280.6,337.98) (closed) - Stroked with DeviceRgb(0.22,0.541)
顺便说一句,上面的代码使用了以下导入:
Imports System.Globalization
Imports System.Text
Imports iText.Kernel.Colors
Imports iText.Kernel.Geom
Imports iText.Kernel.Pdf
Imports iText.Kernel.Pdf.Canvas.Parser
Imports iText.Kernel.Pdf.Canvas.Parser.Data
Imports iText.Kernel.Pdf.Canvas.Parser.Listener
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。