Следующий код использует PDFsharp разделить из страниц PDF-документов на страницы, которые меньше, чем А4 и страницы, которые больше, чем A3:Использования о переменном повторном использовании с PDFsharp
''' <summary>
''' Process the list of pdfs
''' </summary>
Public Sub ProcessPdfs()
Dim tempPath As String
' Code omitted
' Generate a temporary path in case pdfs need to be saved
If String.IsNullOrEmpty(Me.tempFolder) OrElse Not Directory.Exists(Me.tempFolder) Then
tempFolder = Path.GetTempPath()
End If
tempPath = Path.Combine(Me.tempFolder, Path.GetRandomFileName + ".pdf")
' Loop through the pages of the pdfs and process each page in turn. Processing involves
' determining the size of the page, then shrinking, adding the footer and then adding to
' the appropriate output pdf
For Each referenceNumber As String In Me.Pdfs.Keys
For Each pdf As PdfDocument In Me.Pdfs(referenceNumber)
' Save the pdf to disk for PDFSharp to be able to read it properly
If String.IsNullOrEmpty(pdf.FullPath) Then
pdf.Save(tempPath)
pdf = PdfReader.Open(tempPath)
End If
For Each page As PdfPage In pdf.Pages
' Code omitted
Select Case pageArea
Case Is <= a4PageArea
Call AddPage(referenceNumber, pdf, page, PageSize.A4)
Case Else
Call AddPage(referenceNumber, pdf, page, PageSize.A3)
End Select
Next
Next
Next
' Code omitted
' Delete temporary pdfs if there are any
If File.Exists(tempPath) Then
File.Delete(tempPath)
End If
End Sub
''' <summary>
''' Add the specified page to the specified output document
''' </summary>
''' <returns>The page which was added to the output pdf</returns>
Private Function AddPage(ByVal ReferenceNumber As String, ByVal ParentPdf As PdfDocument, ByVal ParentPdfPage As PdfPage, ByVal PageSize As PageSize) As PdfPage
' Code omitted
' Copy the specified page onto thew newly created page
Using parentForm As XPdfForm = XPdfForm.FromFile(ParentPdf.FullPath)
parentForm.PageIndex = ParentPdf.Pages.Cast(Of PdfPage)().ToList().IndexOf(ParentPdfPage)
scaleFactor = 1
' Create PdfSharp graphics object with which to write onto the page
Using graphics As XGraphics = XGraphics.FromPdfPage(outputPdfPage)
graphics.SmoothingMode = XSmoothingMode.HighQuality
' Code omitted
' Draw the page
Call graphics.DrawImage(parentForm, targetRect)
End Using
End Using
Return outputPdfPage
End Function
Что это делает возьмите pdf, прочитайте страницу esch и затем масштабируйте ее так, чтобы она соответствовала размеру страницы, на которую она должна быть напечатана.
У PDFSharp есть проблемы с открытием документов, которые были созданы в Adobe v6, поэтому я использую iTextSharp для восстановления PDF в версии, которую может открыть PDFSharp. Эти PDF-файлы перестраиваются в памяти, и по какой-то причине они должны быть записаны на диск, чтобы PDFSharp обрабатывал их соответствующим образом.
В ProcessPdfs()
Я проверяю, имеет ли файл PDF физический путь, и если я не сохраню его во временном местоположении.
Проблема, которую я обнаружил, заключается в том, что AddPage()
, похоже, постоянно работает с одним и тем же pdf. Я проверил временные файлы PDF, созданные на диске, и они правильные, т. Е. Каждый раз.
Но файл, загруженный в первый оператор using XPdfForm.FromFile(ParentPdf.FullPath)
, никогда не изменяется. Как будто код понимает, что путь к файлу не изменяется и поэтому решает не перезагружать файл.
Я думал, что использование инструкции using
гарантирует, что переменная будет удалена в конце, и поэтому файл будет перезагружаться заново каждый раз. Я не понимаю? Или что здесь происходит?
Кстати, я работал над этим, сохраняя каждый PDF-файл под другим именем файла. Вот почему я думаю, что переменная из блока использования повторно используется каждый раз на основе имени файла ...
Нет, переменная не используется повторно. Вполне возможно, что создается новый экземпляр (объект), который указывает на тот же файл на диске. –
Но тогда это должно быть хорошо, так как файл был перезаписан следующим pdf на этом этапе, не так ли? Я проверил его, открыв файл вручную между обработанным. Тем не менее, контент имеет правильные размеры страниц, но содержание каждой страницы - это тот самый первый pdf-файл, который нужно обработать. –
Вы можете попробовать явно удалить файл после того, как он закончил с помощью pdf sharp, но я бы сказал, что имя каждого файла, которое у вас есть, проще и, вероятно, быстрее, и вы можете его использовать. –