我们组织中有一个小组负责扫描文档并将其转换为 PDF。然后,他们将这些 PDF 与“事件”记录相关联,并将它们存储在数据库中。根据需要,我的应用程序(使用 Winnovative HTML to PDF v9.0.0.0)必须检索与事件关联的 PDF,在每个文件的第一页放置一个标题,并将它们存储在文件系统中。此标头是一个TextElement
.
在某些 PDF 中,标题显示得很漂亮。在其他人身上,标题不会出现。但是,在查看 PDF 时,可以使用光标“突出显示”标题,并成功复制其文本,因此标题确实存在并正确定位。(请参阅插入图像中的绿色箭头。)
我已经确定了两个 PDF,它们是由同一个人相隔 30 分钟扫描并与数据库中的同一事件相关联的。一方面,显示标题;另一方面,事实并非如此。为了进行调查,我已将 的 设置BackColor
为TextElement
Crimson。出现Text
和没有像以前一样出现,但TextElement
总是出现鲜红色。
两者的属性Document
和PDFPage
对象是相同的,包括TransparencyEnabled
属性。随着时间的推移,这种现象存在于各种人扫描的各种文档的 PDF 中。它不仅仅是这个 header TextElement
,而是TextElement
PDF 上的任何地方(例如 Page X of Y、水印)。在给定的 PDF 上,如果Text
一个的 可见,则Text
所有的都是可见的,反之亦然。
我找不到任何模式或解释。 什么可能导致某些 PDF“隐藏”我放在它们上的所有 s 中的(并且只有 s )而Text
其他人没有?Text
TextElement
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
请原谅笨拙的代码。我没写。我只是继承了它。