В нашей организации есть группа, которая сканирует документы и преобразует их в 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-файлах всех видов документов, отсканированных разными людьми с течением времени.И это не только этот заголовок TextElement
, но и TextElement
s повсюду в PDF (например, страница X из Y, водяные знаки).В данном PDF, если Text
одного виден, Text
всего виден, и наоборот.
Я не могу найти образец или объяснение. Что может быть причиной того, что некоторые PDF-файлы "скрывают" 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
Пожалуйста, прости неуклюжий код.Я не писал это.Я просто унаследовал это.