Используя PDF itextSharp, можно создать изображение поверх текста при создании PDF-документа. - PullRequest
3 голосов
/ 22 декабря 2011

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

    Public Function createDoc(ByRef reqResponse As HttpResponse) As Boolean

        Dim m As System.IO.MemoryStream = New System.IO.MemoryStream()
        Dim document As Document = New Document()
        Dim writer As PdfWriter = iTextSharp.text.pdf.PdfWriter.GetInstance(document, m)
        document.Open()
        document.Add(New Paragraph(DateTime.Now.ToString()))
        document.Add(New Paragraph(DateTime.Now.ToString()))
        document.Add(New Paragraph(DateTime.Now.ToString()))
        document.Add(New Paragraph(DateTime.Now.ToString()))
        document.Add(New Paragraph(DateTime.Now.ToString()))
        document.Add(New Paragraph(DateTime.Now.ToString()))
        document.Add(New Paragraph(DateTime.Now.ToString()))
        document.Close()
        writer.Flush()
        writer.Flush()
        'yes; I get the pdf if this is the last statement
        'reqResponse.OutputStream.Write(m.GetBuffer(), 0, m.GetBuffer().Length)

        'this statment does not work it says the stream is closed
        'm.Position = 0
        Dim Reader As PdfReader = New PdfReader(m)
        'Dim rm As MemoryStream = New MemoryStream(m.GetBuffer(), 0, m.GetBuffer().Length)
        Dim PdfStamper As PdfStamper = New PdfStamper(Reader, reqResponse.OutputStream)
        Dim cb As iTextSharp.text.pdf.PdfContentByte = Nothing
        cb = PdfStamper.GetOverContent(1)
        Dim locMyImage As System.Drawing.Image = System.Drawing.Image.FromStream(zproProduceWhiteImageToCovertBarCodeNumbers())
        Dim BImage As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(locMyImage, iTextSharp.text.BaseColor.CYAN)
        Dim overContent As PdfContentByte = PdfStamper.GetOverContent(1)
        BImage.SetAbsolutePosition(5, 5)
        overContent.AddImage(BImage)
        PdfStamper.FormFlattening = True
        PdfStamper.Close()

        'rm.Flush()
        'rm.Close()
        'Dim data As Byte() = rm.ToArray()

        'reqResponse.Clear()
        'Dim finalMs As MemoryStream = New MemoryStream(data)
        'reqResponse.ContentType = "application/pdf"
        'reqResponse.AddHeader("content-disposition", "attachment;filename=labtest.pdf")
        'reqResponse.Buffer = True
        'finalMs.WriteTo(reqResponse.OutputStream)
        'reqResponse.End()


        'Dim data As Byte() = rm.ToArray()
        'reqResponse.OutputStream.Write(data, 0, data.Length)

        ''Response.OutputStream.Write(m.GetBuffer(), 0, m.GetBuffer().Length);
        ''Response.OutputStream.Flush();
        ''Response.OutputStream.Close();
        ''Response.End();


        HttpContext.Current.ApplicationInstance.CompleteRequest()
        Return True
    End Function

ссылка: Поместить текст поверх изображения?

Ссылка на поисковый двигатель: затемнение текста в документе PDF с использованием изображения того же цвета, что и фон PDF изображение пересекается с itextpdf Itextsharp изображение поверх текста белого цвета Itextsharp поместить картинку поверх текста itextpdf изображение сверху

спасибо, Даг Любей из Луизианы

Example of my final product

1 Ответ

8 голосов
/ 22 декабря 2011

Вы можете сделать это довольно легко. Объект Document - это вспомогательный объект, который абстрагирует многие из внутренних элементов модели PDF и по большей части предполагает, что вы хотите передавать содержимое, и этот текст будет располагаться над изображениями. Если вы хотите обойти это, вы можете вместо этого напрямую говорить об объекте PdfWriter. У него есть два свойства DirectContent и DirectContentUnder, которые оба имеют методы с именем AddImage(), которые можно использовать для установки абсолютной позиции на изображении. DirectContent выше существующего контента, а DirectContentUnder ниже его. Смотрите код для примера:

Похоже, вы делаете это в Интернете, поэтому вам нужно адаптировать его к тому потоку, который вы используете, но это должно быть довольно просто.

Одна нота, НИКОГДА вызов GetBuffer() на MemoryStream, ВСЕГДА использование ToArray(). Первый метод включает неинициализированные байты, которые дадут вам потенциально поврежденные файлы PDF.

    ''//File that we are creating
    Dim OutputFile As String = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf")
    ''//Image to place
    Dim SampleImage As String = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "SampleImage.jpg")

    ''//Standard PDF creation setup
    Using FS As New FileStream(OutputFile, FileMode.Create, FileAccess.Write, FileShare.None)
        Using Doc As New Document(PageSize.LETTER)
            Using writer = PdfWriter.GetInstance(Doc, FS)

                ''//Open the document for writing
                Doc.Open()
                ''//Add a simple paragraph
                Doc.Add(New Paragraph("Hello world"))

                ''//Create an image object
                Dim Img = iTextSharp.text.Image.GetInstance(SampleImage)
                ''//Give it an absolute position in the top left corner of the document (remembering that 0,0 is bottom left, not top left)
                Img.SetAbsolutePosition(0, Doc.PageSize.Height - Img.Height)
                ''//Add it directly to the raw pdfwriter instead of the document helper. DirectContent is above and DirectContentUnder is below
                writer.DirectContent.AddImage(Img)

                ''//Close the document
                Doc.Close()
            End Using
        End Using
    End Using
...