2016-08-25 20 views
0

私はPDFのグループをまとめて結合しようとしており、それらがうまく圧縮されており、重複するリソースがないことを確認しています。しかし、私のコードでは、私のライターでSetSmartMode(true)を呼び出すと、最初の書き込みは常にNullReferenceExceptionになります。 NullReferenceExceptionがスローされた、とすぐにmerger.Mergeが呼び出されるようスマートモードを有効にすると、NullReferenceExceptionがスローされます

Private Function CombinePdfBatch(pdfMetaData As IEnumerable(Of QuestDataSet.MetaDataRow), batchNumber As Integer, 
           fileNamePrefix As String, outputDir As String) As String 

    Dim outputFileName As String = Path.Combine(outputDir, fileNamePrefix & "_" & batchNumber & ".pdf") 

    Using combinedPdf As New PdfDocument(New PdfWriter(Path.Combine(outputDir, fileNamePrefix & "_" & batchNumber & ".pdf")).SetSmartMode(True)) 

     'Make sure we close the underlying stream when we're done with the combination 
     combinedPdf.SetCloseWriter(True) 
     combinedPdf.SetCloseReader(False) 
     combinedPdf.SetFlushUnusedObjects(False) 
     combinedPdf.GetWriter().SetCompressionLevel(CompressionConstants.BEST_COMPRESSION) 
     combinedPdf.GetWriter().SetCloseStream(True) 
     combinedPdf.SetDefaultPageSize(New Geom.PageSize(630, 810)) 

     Dim merger As New PdfMerger(combinedPdf) 

     For Each currentMD As QuestDataSet.MetaDataRow In pdfMetaData 
      Using currentPDF As New PdfDocument(New PdfReader(Path.Combine(programPaths.Input, currentMD.ReceivedFilesRowByInputFileRelation.FileName))) 
       currentPDF.SetCloseReader(True) 
       currentPDF.SetCloseWriter(False) 
       currentPDF.GetReader().SetCloseStream(True) 

       currentMD.CombinedFileName = outputFileName 
       currentMD.StartPage = combinedPdf.GetNumberOfPages() + 1 
       merger.Merge(currentPDF, 1, currentPDF.GetNumberOfPages()) 
       currentMD.EndPage = combinedPdf.GetNumberOfPages() 
      End Using 
     Next 
     merger.Close()    
    End Using 

    Return outputFileName 
End Function 

:ここ

は私の(vb.net)コードです。私はそれを他の多くの機能に置き換えましたが、ライターがスマートモードになっているときにPDFに何かが追加された場合、クラッシュします。

スマートモードを無効にすると、PDFがマージされます。しかし、私はこれらのPDFのサイズをできるだけ小さくする必要がありますあまりにも多くの品質を犠牲にせずに。私は彼らがすべて同じフォントを使用し、いくつかのストック画像を共有していることを知っているので、私はそうするためにそれらをすべて組み合わせると思った。

編集:私はあなたたちを愛しているのでここではスタックトレースです:

System.NullReferenceException occurred 
    HResult=-2147467261 
    Message=Object reference not set to an instance of an object. 
    Source=itext.kernel 
    StackTrace: 
     at iText.Kernel.Pdf.PdfWriter.ByteStore.SerDic(PdfDictionary dic, Int32 level, ByteBufferOutputStream bb, IntHashtable serialized) 
     at iText.Kernel.Pdf.PdfWriter.ByteStore.SerObject(PdfObject obj, Int32 level, ByteBufferOutputStream bb, IntHashtable serialized) 
     at iText.Kernel.Pdf.PdfWriter.ByteStore..ctor(PdfStream str, IntHashtable serialized) 
     at iText.Kernel.Pdf.PdfWriter.SmartCopyObject(PdfObject obj)  
     at iText.Kernel.Pdf.PdfWriter.CopyObject(PdfObject obj, PdfDocument document, Boolean allowDuplicating) 
     at iText.Kernel.Pdf.PdfObject.ProcessCopying(PdfDocument documentTo, Boolean allowDuplicating) 
     at iText.Kernel.Pdf.PdfArray.CopyContent(PdfObject from, PdfDocument document) 
     at iText.Kernel.Pdf.PdfWriter.CopyObject(PdfObject obj, PdfDocument document, Boolean allowDuplicating) 
     at iText.Kernel.Pdf.PdfObject.ProcessCopying(PdfDocument documentTo, Boolean allowDuplicating) 
     at iText.Kernel.Pdf.PdfDictionary.CopyContent(PdfObject from, PdfDocument document) 
     at iText.Kernel.Pdf.PdfWriter.CopyObject(PdfObject obj, PdfDocument document, Boolean allowDuplicating) 
     at iText.Kernel.Pdf.PdfObject.ProcessCopying(PdfDocument documentTo, Boolean allowDuplicating) 
     at iText.Kernel.Pdf.PdfObject.CopyTo(PdfDocument document, Boolean allowDuplicating) 
     at iText.Kernel.Pdf.PdfDictionary.CopyTo(PdfDocument document, Boolean allowDuplicating) 
     at iText.Kernel.Pdf.PdfDictionary.CopyTo(PdfDocument document, IList`1 excludeKeys, Boolean allowDuplicating) 
     at iText.Kernel.Pdf.PdfPage.CopyTo(PdfDocument toDocument, IPdfPageExtraCopier copier) 
     at iText.Kernel.Pdf.PdfDocument.CopyPagesTo(IList`1 pagesToCopy, PdfDocument toDocument, Int32 insertBeforePage, IPdfPageExtraCopier copier) 
     at iText.Kernel.Pdf.PdfDocument.CopyPagesTo(IList`1 pagesToCopy, PdfDocument toDocument, IPdfPageExtraCopier copier) 
     at iText.Kernel.Pdf.PdfDocument.CopyPagesTo(IList`1 pagesToCopy, PdfDocument toDocument) 
     at iText.Kernel.Utils.PdfMerger.Merge(PdfDocument from, IList`1 pages) 
     at iText.Kernel.Utils.PdfMerger.Merge(PdfDocument from, Int32 fromPage, Int32 toPage) 
     at QuestMonolithic.Process.CombinePdfBatch(IEnumerable`1 pdfMetaData, Int32 batchNumber, String fileNamePrefix, String outputDir) in C:\Users\cchrist\Documents\Visual Studio 2012\Projects\Quest_Monolithic\trunk\source\Process.vb:line 594 
    InnerException: 

答えて

4

それはiTextの7 .NETコードの既知のバグだし、修正はすぐに展開されます。 SerDic()メソッドは、スマートモードでのコピーで.NETで誤って辞書キーの取得を処理した場合にのみ呼び出され、nullポインタが生成されます。

あなたはそれを自分で修正したい場合は、itext.kernel.PdfWriterにライン592を置き換える:

keys = dic.KeySet().ToArray(keys); 

dic.KeySet().ToArray(keys); 

+0

ありがとうございました。私はこれを試してみる。 .NETコードについて知っておくべきことがありますか? – sonicbhoc

関連する問題