2012-01-03 7 views
1

Я пытаюсь объединить несколько документов PDFA в один файл, используя iTextSharp 5.1.3, используя следующий код:конкатенации PDFA документов с использованием iTextSharp в действительный документ PDFA

Try 
     Dim f As Integer = 0 
     Dim outFile As String = destinationFile 
     Dim document As iTextSharp.text.Document = Nothing 
     Dim writer As PdfSmartCopy = Nothing 
     While f < sourceFiles.Length 
      ' Create a reader for a certain document 
      Dim reader As New PdfReader(sourceFiles(f)) 

      ' Retrieve the total number of pages 
      Dim n As Integer = reader.NumberOfPages 
      If f = 0 Then 
       document = New iTextSharp.text.Document(reader.GetPageSizeWithRotation(1)) 
       writer = New PdfSmartCopy(document, New FileStream(outFile, FileMode.Create)) 
       document.Open() 
      End If 

      Dim page As PdfImportedPage 
      Dim i As Integer = 0 
      While i < n 
       i += 1 
       page = writer.GetImportedPage(reader, i) 
       writer.AddPage(page) 
      End While 
      Dim form As PRAcroForm = reader.AcroForm 
      If form IsNot Nothing Then 
       writer.CopyAcroForm(reader) 
      End If 
      f += 1 
     End While 
     document.Close() 
    Catch generatedExceptionName As Exception 
    End Try 

Если открыть любой из входных файлов Acrobat Reader XI получает сообщение о том, что они действительно являются PDFA, но не если я открою выходной файл, созданный выше. Таким образом, казалось бы, мой недавно созданный конкатенированный PDF-документ не соответствует PDFA.

Я пробовал задавать свойство writer.PDFXConformance для PdfWriter.PDFA1A, но это не помогает.

Кто-нибудь знает, можно ли достичь того, что я пытаюсь сделать?

+0

У меня нет большого опыта работы с iTextSharp, поэтому я не могу напрямую. Но, возможно, было бы полезно сузить проблему, пытаясь проверить выходной PDF с помощью PDF/A validator; есть некоторые свободно доступные, например. [здесь] (http://www.pdf-tools.com/pdf/pdfa-online-pruefen.aspx) и [здесь] (http://www.validatepdfa.com/) (оба онлайн). – tohuwawohu

ответ

1

При использовании PDFXConformance вам также необходимо позвонить CreateXmpMetadata на объект writer. Обычно я делаю это прямо перед закрытием документа, я не уверен на 100%, что он должен туда идти, но это все, что его ставят.

End While 
writer.CreateXmpMetadata() 
document.Close() 

Затем, когда вы инстанцируете ваш писателю установить свойство соответствия так же, как вы были:

writer = New PdfSmartCopy(document, New FileStream(outFile, FileMode.Create)) 
writer.PDFXConformance = PdfWriter.PDFA1A 
+0

Спасибо @Chris! CtreateXmpMetadata() сделал трюк. – granaker

Смежные вопросы