Получите проектный размер изображения

Я научился получать размер изображения с помощью itextsharp pdf, размер изображения - это физический размер до того, как изображение было вставлено в pdf.

Dim iwidth As Integer = tg.GetAsNumber(PdfName.WIDTH).IntValue
Dim iheight As Integer = tg.GetAsNumber(PdfName.HEIGHT).IntValue

Когда я извлек изображение, оно очень большое, больше размера бумаги.

Но если вы просмотрите изображение внутри pdf с помощью любого программного обеспечения для чтения pdf, изображение будет маленьким.

Как я могу получить размер разработанного изображения внутри pdf?

Я использую этот код, и я не знаю, правильно ли это, я не знаю, что делать дальше.

Dim pdfDesignedImage As iTextSharp.text.pdf.parser.InlineImageInfo

Это мой второй аккаунт, в первом я ошибся. Прости за это. Я надеюсь, что смогу стать лучше, используя эту учетную запись.


person XenKid    schedule 21.03.2012    source источник


Ответы (1)


Существует интерфейс с плохим названием ITextExtractionStrategy, который вы можете реализовать, чтобы получить расширенную информацию при извлечении элементов из PDF. Я говорю «плохо названный», потому что, хотя он говорит «текст», он также поддерживает изображения. Этот интерфейс имеет 5 методов, 4 из которых текстовые и их можно просто игнорировать. Интересующий вас метод — RenderImage. Ниже приведена полная рабочая реализация этого:

Public Class ImageInfoTextExtractionStrategy
    Implements iTextSharp.text.pdf.parser.ITextExtractionStrategy
#Region " Extra Methods - Just Ignore "
    Public Sub BeginTextBlock() Implements iTextSharp.text.pdf.parser.IRenderListener.BeginTextBlock
    End Sub
    Public Sub EndTextBlock() Implements iTextSharp.text.pdf.parser.IRenderListener.EndTextBlock
    End Sub
    Public Sub RenderText(renderInfo As iTextSharp.text.pdf.parser.TextRenderInfo) Implements iTextSharp.text.pdf.parser.IRenderListener.RenderText
    End Sub
    Public Function GetResultantText() As String Implements iTextSharp.text.pdf.parser.ITextExtractionStrategy.GetResultantText
        Return Nothing
    End Function
#End Region
    ''//We'll add all image rectangles to this collection
    Private _AllImageRectangles As New List(Of iTextSharp.text.Rectangle)
    Public ReadOnly Property AllImageRectangles As List(Of iTextSharp.text.Rectangle)
        Get
            Return Me._AllImageRectangles
        End Get
    End Property
    Public Sub RenderImage(renderInfo As iTextSharp.text.pdf.parser.ImageRenderInfo) Implements iTextSharp.text.pdf.parser.IRenderListener.RenderImage
        ''//Get the image's matrix
        Dim m = renderInfo.GetImageCTM()
        Dim w, h, x, y As Single
        ''//Get the various parameters from the matrix
        w = m(iTextSharp.text.pdf.parser.Matrix.I11)
        h = m(iTextSharp.text.pdf.parser.Matrix.I22)
        x = m(iTextSharp.text.pdf.parser.Matrix.I31)
        y = m(iTextSharp.text.pdf.parser.Matrix.I32)
        ''//Turn the parameters into a rectangle
        Me._AllImageRectangles.Add(New iTextSharp.text.Rectangle(x, y, x + w, y + h))
    End Sub
End Class

Чтобы использовать этот подкласс, мы передаем его (опять же с неудачным названием) методу iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(). Обычно вы вызываете этот метод и присваиваете строковый результат переменной, но в нашем случае текст нас не волнует, так что не беспокойтесь. Чтобы использовать его, вы должны сделать это:

    ''//Path to our pdf with images
    Dim PdfWithImage = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "PdfWithImage.pdf")
    ''//Bind a reader to our PDF
    Dim reader As New PdfReader(PdfWithImage)
    ''//Create an instance of our custom extraction class
    Dim strat As New ImageInfoTextExtractionStrategy()
    ''//Loop through each page in our PDF
    For I = 1 To reader.NumberOfPages
        ''//The GetTextFromPage method does the work even though we are working with images
        iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(reader, I, strat)
    Next
    ''//Get all image rectangles found
    Dim Rects = strat.AllImageRectangles
    For Each R In Rects
        ''//Do something with your rectangles here
    Next
person Chris Haas    schedule 21.03.2012
comment
Я очень извиняюсь за текст, который я написал, я учусь медленно. - person XenKid; 21.03.2012