2017-09-06 1 views
1

私はPDFを読み込み、作成中のPDFでいくつかのページを複製しようとしています。私が作成したPDFファイルを保存しようとすると、例外が悪名高いPdfSharpページのクローニング:同じキーを持つアイテムが既に追加されています

にスローされますが、同じキーを持つ項目がすでに

を追加された私はPdf Document Save to stream method throwing exceptionで述べた同じエラー(PdfSharpフォーラムを見つけました2010年から)、しかし決議は言及されなかった。そして、SO c# PDFSharp - what's the point of Table.Clone?問題と同じ種類のように見えます(が、私は私の場合にそれを適用する方法が表示されない)

私のテストコードは次のとおりです。 (Nuget経由で最新のPdfSharpを使用して注)

using PdfSharp.Pdf; 
using PdfSharp.Pdf.IO; 

namespace TestError 
{ 
    public class TestCode 
    { 
     public void DupePages(string inFilePath, string outFilePath) 
     { 
      var inDoc = PdfReader.Open(inFilePath, PdfDocumentOpenMode.Import); 
      var outDoc = new PdfDocument(); 

      outDoc.AddPage((PdfPage)inDoc.Pages[0].Clone()); 
      outDoc.AddPage((PdfPage)inDoc.Pages[0].Clone()); 

      outDoc.Save(outFilePath); // Exception thrown here 
     } 
    } 
} 
私はクローン操作が異なるオブジェクトを返していることを確認しましたが、何とかそれはPdfSharpのために十分ではありません

System.ArgumentException occurred 
    HResult=0x80070057 
    Message=An item with the same key has already been added. 
    Source=mscorlib 
    StackTrace: 
    at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) 
    at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) 
    at PdfSharp.Pdf.PdfReferenceTable.Compact() 
    at PdfSharp.Pdf.PdfDocument.PrepareForSave() 
    at PdfSharp.Pdf.PdfDocument.DoSave(PdfWriter writer) 
    at PdfSharp.Pdf.PdfDocument.Save(Stream stream, Boolean closeStream) 
    at PdfSharp.Pdf.PdfDocument.Save(String path) 
    at TestError.TestCode.DupePages(String inFilePath, String outFilePath) 

とスタックトレースがあります。

ページを正常にクローンするにはどうすればよいですか?

+0

すべてのPDFファイルでクラッシュしますか? MCVEを持つことは良いことです。 https://stackoverflow.com/help/mcveこのテンプレートを使用することができます:http://pdfsharp.net/wiki/IssueSubmissions.ashx –

+0

'Table.Clone()'はMigraDocであり、PDFsharpの 'Page.Clone ) '。 –

+0

@ User241.007はい、PDFファイルでクラッシュします。そして、そのコードは* MCVEです –

答えて

1

私のオリジナルコードはPdfSharp Latest stable 1.32.3057でテストされました。 Cloneを使用しなかった場合、このバージョンを使用すると、AddPageはページへの参照のみを追加し、重複しません。

しかし、User241.007がLatest prerelease 1.5.4619-beta4cバージョンに移動するように指示されたとき、物事が変更されました。例外はスローされなくなりましたが、結果のファイルが正しくありませんでした。わかりやすくするために、私はコードを次のように少し変更しました。今は期待通りに動作します。

using PdfSharp.Pdf; 
using PdfSharp.Pdf.IO; 

namespace TestError 
{ 
    public class TestCode 
    { 
     public void DupePages(string inFilePath, string outFilePath) 
     { 
      var inDoc = PdfReader.Open(inFilePath, PdfDocumentOpenMode.Import); 
      var outDoc = new PdfDocument(); 

      var page = inDoc.Pages[0]; 
      outDoc.AddPage(page); 
      page.Rotate = 0; 
      outDoc.AddPage(page); 

      outDoc.Save(outFilePath); 
     } 
    } 
} 

Rotateの設定は、ページの独立した複製がoutDocに追加されたことを私の場合には決定的に証明しています。結果を見ると、2つのページの回転が異なります(実際にテストしているソースのPDFには最初の90回転のページがあります)

通常、プレリリース版を表示しないようにNugetが設定されていますが、場合は、私が望むオプションかもしれない。

関連する問題