2016-02-26 28 views
6

Próbuję wykonać prostą akcję: dodanie zdjęcia (pliku JPG) do pliku PDF wygenerowanego od podstaw za pomocą PDFsharp v1.32.2608.0 z wykorzystaniem .NET Framework 4.0 i MVC. NETPDFsharp, błąd wyświetlania JPG w pliku PDF

Używam następny kod, aby wykonać tę czynność:

PdfDocument doc = new PdfDocument(); 
PdfPage pag = doc.AddPage(); 
XGraphics gfx = XGraphics.FromPdfPage(pag); 

Image foto = Image.FromStream([stream]); 
XImage xfoto = XImage.FromGdiPlusImage(foto); 
gfx.DrawImage(xfoto, 30, 130, 380, 250); 

MemoryStream stream = new MemoryStream(); 
doc.Save(stream, false); 

problem polega na tym, że podczas otwierania pliku PDF, obraz pojawia się źle, uszkodzony, uszkodzony ... nie wiem W jaki sposób to wyjaśnić, możesz pobrać oryginalne zdjęcie i wygenerowany plik PDF w następnym public Dropbox folder, aby zobaczyć wynik.

Ten błąd nie jest spójny, niektóre zdjęcia mają ten problem, inne nie, i nie wiem dlaczego. Może jest format w pliku lub coś podobnego? Jeśli to jest problem, które formaty są prawidłowe?

Każda pomoc zostanie doceniona.

Edycja: Coś, co zauważyłem, to że zły obraz wygląda inaczej w zależności od programu, w którym wizualizuję plik PDF. Na przykład, jeśli widzisz plik PDF za pomocą wizualizatora Dropbox (korzystając z podanego linku), obraz wygląda dobrze; jeśli korzystam z przeglądarki Chrome PDF, obraz jest nieprawidłowy, ale wyświetlany tylko w czerni i bieli z paskami, ale nadal widoczny; jeśli używam programu Adobe Acrobat Reader DC, obraz nadal jest błędny, ale zupełnie nierozpoznany.

Edycja 2: Zmieniłem na PDFSharp v1.50.4000 (beta 3), aby sprawdzić, czy nie jest to problem biblioteki, ale problem jest nadal ten sam. Kod z nowej wersji, jest następująca:

PdfDocument doc = new PdfDocument(); 
PdfPage pag = doc.AddPage(); 
XGraphics gfx = XGraphics.FromPdfPage(pag); 

XImage xfoto = XImage.FromStream([stream]); 
gfx.DrawImage(xfoto, 30, 130, 380, 250); 

MemoryStream stream = new MemoryStream(); 
doc.Save(stream, false); 
+0

Biorąc pod uwagę Twoją edycję prawdopodobnie występują problemy w samej jpg ... Czy możesz udostępnić ją do wglądu? – mkl

+0

@mkl Obrazek można znaleźć na Dropbox (patrz link w tekście poniżej pola kodu). –

Odpowiedz

5

To rozwiązanie mam, dzięki TH-Soft z PDFsharp forum dla pokazać mi drogę:

PdfDocument doc = new PdfDocument(); 
PdfPage pag = doc.AddPage(); 
XGraphics gfx = XGraphics.FromPdfPage(pag); 

MemoryStream strm = new MemoryStream(); 
Image img = Image.FromStream([stream]); 
img.Save(strm, System.Drawing.Imaging.ImageFormat.Png); 

XImage xfoto = XImage.FromStream(strm); 
gfx.DrawImage(xfoto, 30, 130, 380, 250); 

MemoryStream stream = new MemoryStream(); 
doc.Save(stream, false); 

Przed dodać obraz do formatu PDF, konwertować obraz do PNG więc formacie "Problemy", które obraz został usunięty.

Oczywiście nie jest to najlepsze rozwiązanie, a PDFsharp powinien zarządzać tym formatem, ale wkrótce nie nastąpi (przynajmniej nie jest zarządzany w PDFsharp 1.5 beta3).

0

obsługi obrazów JPEG działa lepiej, gdy używasz PDFsharp 1.50 lub nowszej i używać XImage.FromStream zamiast Image.FromStream plusa XImage.FromGdiPlusImage.

PDFsharp potrzebuje kopii pliku JPEG. Korzystanie z XImage.FromStream zapewnia, że ​​PDFsharp otrzymuje oryginalne dane.

Twój kod będzie działał poprawnie z PDFsharp 1.32, jeśli pozostaniesz pod Windows XP. Późniejsze wersje Windows mają problem, który widzisz, ale z PDFsharp 1.50 powinien działać ponownie.

+0

Cześć, bracie. To nie zadziałało, pobrałem projekt PDFsharp 1.5 beta3b (ostatnia wersja znalazłem) i dodałem go do projektu, ale obraz nadal ma ten sam problem. –

+1

Tak, ten obraz nie jest obsługiwany poprawnie, dziwny format JPEG. Wygląda poprawnie, gdy plik PDF jest wyświetlany w przeglądarce Firefox. Zbadamy to dalej w przyszłym tygodniu. Jeśli musisz użyć tego konkretnego obrazu: otwórz za pomocą procesora obrazu (np. MS Paint), użyj File => Save As, a nowy obraz będzie działał z PDFsharp. –

+0

Dzięki, @ThomasH, który rozwiązał problem. Nadal nie wiem, czy to może być ostateczna odpowiedź, czy też jest to "łatka" na to pytanie. Jeśli umieścisz to jako odpowiedź, oznacza to, że jest to rozwiązanie. –

0

Twój obraz to CMYK JPEG. Po osadzeniu w pliku PDF jego przestrzeń kolorów jest ustawiona na RGB, co powoduje nieprawidłowe dekodowanie.
Nie wiem, czy można ustawić przestrzeń kolorów obrazu w kodzie na CMYK lub jeśli jest to coś, co należy naprawić w PDFsharp.

+0

PDFsharp opiera się na GDI + lub WPF, aby określić, czy JPEG to RGB czy CMYK. –

+0

Czy uważasz, że powinniśmy zgłosić ten problem deweloperom PDFsharp? –

+0

Niestety zarówno GDI +, jak i WPF mają problemy z obsługą plików CMYK JPEG. –