2016-11-24 20 views
8

Wykryto problem z PDFSharp podczas rysowania w różnych skalach za pomocą transformacji skali.PDFSharp transform issue

W tym przykładzie rysujemy dwa prostokąty w różnych skalach, generujemy XPS z FixedDocumentSequence i na koniec konwertujemy XPS na PDF przy użyciu konwertera PDFSharps XPS.

var visual = new DrawingVisual(); 
DrawingContext dc = visual.RenderOpen(); 

// Setup transformations. 
dc.PushTransform(new TranslateTransform(0, 1122.0)); 
dc.PushTransform(new ScaleTransform(3.77857136726379, -3.77857136726379)); 
dc.PushTransform(new TranslateTransform(-1719.41186523438, -1410.32360839844)); 
dc.PushTransform(new ScaleTransform(0.0117647061124444, 0.0117647061124444)); 

// Draw red rectangle. 
var redPen = new Pen(Brushes.Red, 1); 
var rectGeo1 = new RectangleGeometry(new Rect(160000, 130000, 8000, 5000)); 
dc.DrawGeometry(Brushes.Transparent, redPen, rectGeo1); 

// Pop two transformations. 
dc.Pop(); 
dc.Pop(); 

// Draw blue rectangle. 
var bluePen = new Pen(Brushes.Blue, 0.5); 
var rectGeo2 = new RectangleGeometry(new Rect(12, 12, 150.9408, 107.088539)); 
dc.DrawGeometry(Brushes.Transparent, bluePen, rectGeo2); 
dc.Close(); 

// Generate XPS from DocumentSequence. 
var a3Size = new Size(1587, 1123); 
var docSeq = CreateDocumentSequence(a3Size, visual); 
string dirPath = @"C:\Temp\"; 
string xpsFilePath = dirPath + "test.xps"; 
string pdfFilePath = dirPath + "test.pdf"; 
WriteXpsFile(docSeq, xpsFilePath); 

// Generate PDF from XPS (PdfSharp) 
XpsConverter.Convert(xpsFilePath, pdfFilePath, 0); 

Kompletny program można znaleźć here i rozwiązanie VS here.

czerwony prostokąta ma być wyrównane w prawym górnym rogu prostokąta niebieskim. To, co dostajemy, gdy patrząc na wygenerowanym XPS:

XPS screenshot

Ale w wygenerowanym pliku PDF możemy uzyskać szczelinę między dwoma prostokątami.

enter image description here

Close-up

Problem ten jest oczywiste, gdy rysunek daleko od pochodzenia, w tym przykładzie czerwony prostokąta umieszczone na 160000, 130000, w skali 1:85. Szczelina staje się większa od czasu, z którego rysujesz, czy może to być błąd precyzji/zaokrągleń?

Próbowałem rozwiązać ten problem bez powodzenia. Każda pomoc w znalezieniu przyczyny byłaby bardzo cenna! Uwaga: nie jestem pewien, czy problem dotyczy renderowania PDFSharp czy konwersji XPS.

Używam PDFSharp 1.31 (nowsze wersje nie obejmuje wsparcia XPS).

Kompletne rozwiązanie Visual Studio z tego przykładu (w tym PDFSharp lib) jest dostępny here.

+0

Zakładam, że już próbował innych XPS do konwerterów PDF, a problem nadal występuje tylko w PDFSharp? –

+0

@AndrejsCainikovs Prawidłowo, wypróbowałem inne konwertery i otrzymałem poprawny wynik. To jest problem z PDFSharp. – salle55

Odpowiedz

8

Znaleziono przyczynę, PDFSharp jest zaokrąglania wartości macierzy transformacji do 4 miejsc po przecinku podczas generowania PDF, który nie jest na tyle w tej sprawie.

Aby zwiększyć precyzję zmieniłem od 4 do 8 cyfr zastępcze w PdfContentWriter:

enter image description here

Jest to różnica w generowanym pliku PDF (tryb gadatliwy podczas uruchamiania debugowania):

enter image description here

Który wynik w prawidłowo renderowanym pliku PDF:

enter image description here