Winnovative Hides Text of TextElements on PDFs

94 Views Asked by At

There is a group somewhere in our organization that scans documents and converts them to PDFs. They then associate those PDFs with an "event" record and store them in a database. On demand, my application -- which uses Winnovative HTML to PDF v9.0.0.0 -- has to retrieve the PDFs associated with an event, place a header on the first page of each, and store them on the file system. This header is a TextElement.

On some PDFs, the header displays beautifully. On others, the header does not appear. However, when viewing the PDF, the header can be "highlighted" with the cursor and its text successfully copied, so the header is indeed present and properly positioned. (See the green arrow in the inserted image.)

Output Examples

I have identified two PDFs that were scanned by the same person thirty minutes apart and associated with the same event in the database. On one, the header is displayed; on the other, it is not. To investigate, I have set the BackColor of the TextElement to Crimson. The Text appears and doesn't appear as before, but the TextElement always appears bright red.

The properties of the two Document and PDFPage objects are identical, including the TransparencyEnabled property. This phenomenon is present in PDFs of all sorts of documents scanned by various people over time. And it's not just this header TextElement, but TextElements everywhere on the PDF (e.g. Page X of Y, watermarks). On a given PDF, if the Text of one is visible, the Text of all is visible, and vice versa.

I can find no pattern or explanation. What could be causing some PDFs to "hide" the Text (and only the Text) of all TextElements that I put on them while others don't?

Private Sub AddTitleToFirstPage(ByRef pdf As Document)
    Dim headerSystemFont As New Font("Arial", 10)
    Dim headerFont As PdfFont = pdf.Fonts.Add(headerSystemFont)
    Dim headerTextElement As New TextElement(65, 20, "My Page Title", headerFont)

    headerTextElement.TextAlign = HorizontalTextAlign.Center
    headerTextElement.ForeColor = Color.DarkBlue
    headerTextElement.BackColor = Color.Crimson

    pdf.Pages(0).AddElement(headerTextElement)
End Sub

Friend Function UpdatePdfDoc(pdfBytes As Byte()) As Byte()
    Dim bytes As Byte()

    Using docStream As New MemoryStream(pdfBytes, 0, pdfBytes.Length)
        Dim returnDoc As Document = New Document(docStream)
        returnDoc.LicenseKey = WinnovativeLicenceKey

        AddTitleToFirstPage(returnDoc)

        bytes = returnDoc.Save()
        docStream.Close()
    End Using

    Return bytes
End Function

Friend Function GetEventObjectPdfSource(scannedDocIds As List(Of String)) As Object
    Dim scannedDocObjectPdfSourceList As New List(Of Byte())()

    For Each scannedDocId As String In scannedDocIds
        Dim scannedDocObjectPdfSource As Byte() = GetScannedDocBlobById(scannedDocId)
        scannedDocObjectPdfSource = UpdatePdfDoc(scannedDocObjectPdfSource)
        scannedDocObjectPdfSourceList.Add(scannedDocObjectPdfSource)
    Next

    Return scannedDocObjectPdfSourceList
End Function

Friend Function GetEventObjectPdf(eventId As String) As String
    Dim pdfFileName As String = GetPDFFileName(eventId)
    Dim scannedDocIds As List(Of String) = GetScannedDocumentsForEvent(eventId)
    Dim objectPdfSourceList As List(Of Byte()) = CType(GetEventObjectPdfSource1(scannedDocIds), List(Of Byte()))

    For Each objectPdfSource As Byte() In objectPdfSourceList
        Using docStream As New MemoryStream(objectPdfSource, 0, objectPdfSource.Length)
            Dim masterDoc As New Document(docStream)
            masterDoc.LicenseKey = WinnovativeLicenceKey

            Do While masterDoc.Bookmarks.Count > 0
                masterDoc.Bookmarks.Remove(0)
            Loop

            Try
                masterDoc.AutoCloseAppendedDocs = True
                masterDoc.Save(pdfFileName)
            Catch ex As Threading.ThreadAbortException
                Threading.Thread.ResetAbort()
            Finally
                masterDoc.DetachStream()
                masterDoc.Close()
            End Try

            docStream.Close()
        End Using
    Next

    Return pdfFileName
End Function

Please forgive the clunky code. I didn't write it. I just inherited it.

0

There are 0 best solutions below