0

我们组织中有一个小组负责扫描文档并将其转换为 PDF。然后,他们将这些 PDF 与“事件”记录相关联,并将它们存储在数据库中。根据需要,我的应用程序(使用 Winnovative HTML to PDF v9.0.0.0)必须检索与事件关联的 PDF,在每个文件的第一页放置一个标题,并将它们存储在文件系统中。此标头是一个TextElement.

在某些 PDF 中,标题显示得很漂亮。在其他人身上,标题不会出现。但是,在查看 PDF 时,可以使用光标“突出显示”标题,并成功复制其文本,因此标题确实存在并正确定位。(请参阅插入图像中的绿色箭头。)

输出示例

我已经确定了两个 PDF,它们是由同一个人相隔 30 分钟扫描并与数据库中的同一事件相关联的。一方面,显示标题;另一方面,事实并非如此。为了进行调查,我已将 的 设置BackColorTextElementCrimson。出现Text和没有像以前一样出现,但TextElement 总是出现鲜红色。

两者的属性DocumentPDFPage对象是相同的,包括TransparencyEnabled属性。随着时间的推移,这种现象存在于各种人扫描的各种文档的 PDF 中。它不仅仅是这个 header TextElement,而是TextElementPDF 上的任何地方(例如 Page X of Y、水印)。在给定的 PDF 上,如果Text一个的 可见,则Text所有的都是可见的,反之亦然。

我找不到任何模式或解释。 什么可能导致某些 PDF“隐藏”我放在它们上的所有 s 中的(并且只有 s )而Text其他人没有?TextTextElement

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

请原谅笨拙的代码。我没写。我只是继承了它。

4

0 回答 0