0

PDF のグループをまとめて、それらが適切に圧縮されていること、および重複するリソースがないことを確認しようとしています。ただし、私のコードでは、ライターで SetSmartMode(true) を呼び出すと、ライターへの最初の書き込みで常に NullReferenceException が発生します。

ここに私の(vb.net)コードがあります:

    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

merger.Mergeが呼び出されるとすぐに aNullReferenceExceptionがスローされます。私はそれを他の多くの機能に置き換えましたが、ライターがスマート モードのときに 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

1 に答える 1

4

これは、iText 7 .NET コードの既知のバグであり、修正プログラムがまもなく展開されます。SerDic()スマート モードでコピーする場合にのみ呼び出されるメソッドは、.NET でディクショナリ キーの取得を正しく処理せず、null ポインターが発生します。

自分で修正したい場合は、 の 592 行目を次のように置き換えますitext.kernel.PdfWriter

dic.KeySet().ToArray(keys);

keys = dic.KeySet().ToArray(keys);
于 2016-08-26T07:24:30.300 に答える