2016-02-26 19 views
6

Tôi đang cố gắng thực hiện một thao tác đơn giản: thêm ảnh (tệp JPG) bên trong tệp PDF được tạo từ đầu bằng PDFsharp v1.32.2608.0 bằng .NET Framework 4.0 và MVC. NETPDFsharp, lỗi hiển thị JPG ở định dạng PDF

tôi đang sử dụng mã tiếp theo để thực hiện hành động này:

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); 

vấn đề là khi tôi mở file PDF, hình ảnh xuất hiện sai, hỏng, vỡ ... tôi không biết cách giải thích, bạn có thể tải xuống ảnh gốc và PDF được tạo trong public Dropbox folder tiếp theo để xem kết quả.

Lỗi này không nhất quán, một số ảnh có vấn đề chính xác này, một số khác thì không và tôi không biết tại sao. Có thể là định dạng trong tệp hoặc một cái gì đó tương tự? Nếu đó là vấn đề, định dạng nào hợp lệ?

Mọi trợ giúp sẽ được đánh giá cao.

Chỉnh sửa: Điều tôi lưu ý là hình ảnh sai trông khác nhau tùy thuộc vào chương trình tôi hình dung tệp PDF. Ví dụ, nếu bạn nhìn thấy PDF bằng cách sử dụng visualizer của Dropbox (sử dụng liên kết tôi cung cấp) hình ảnh có vẻ tốt; nếu tôi sử dụng Trình xem PDF trên Chrome, hình ảnh sai nhưng chỉ xuất hiện trong màu đen và trắng và có sọc nhưng vẫn hiển thị; nếu tôi sử dụng Adobe Acrobat Reader DC, hình ảnh vẫn sai nhưng hoàn toàn không được nhận ra.

Chỉnh sửa 2: Tôi đã thay đổi thành PDFSharp v1.50.4000 (beta 3) để xem liệu đó có phải là vấn đề của thư viện hay không nhưng vấn đề vẫn như cũ. Mã này, với phiên bản mới, là như sau:

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

Xem xét chỉnh sửa của bạn có thể có vấn đề trong chính jpg ... Bạn có thể chia sẻ nó để kiểm tra không? – mkl

+0

@mkl Hình ảnh có thể được tìm thấy trên Dropbox (xem liên kết trong văn bản bên dưới hộp mã). –

Trả lời

5

Đây là giải pháp tôi đã nhận, nhờ tới TH-Soft từ PDFSharp diễn đàn để chỉ cho tôi đường dẫn:

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); 

Trước khi tôi thêm hình ảnh vào PDF, tôi chuyển đổi hình ảnh để PNG để định dạng "vấn đề" mà hình ảnh đã bị xóa.

Tất nhiên, không phải là giải pháp tốt nhất và PDFsharp nên quản lý vấn đề định dạng này nhưng nó sẽ không xảy ra sớm (ít nhất là không được quản lý trong PDFsharp 1,5 beta3).

0

Xử lý hình ảnh JPEG hoạt động tốt hơn khi bạn sử dụng PDFSharp 1.50 hoặc mới hơn và sử dụng XImage.FromStream thay vì Image.FromStream cộng XImage.FromGdiPlusImage.

PDFsharp cần bản sao của tệp JPEG. Sử dụng XImage.FromStream đảm bảo PDFsharp nhận dữ liệu gốc.

Mã của bạn sẽ hoạt động tốt với PDFsharp 1.32 nếu bạn sử dụng Windows XP. Các phiên bản Windows sau có vấn đề bạn thấy, nhưng với PDFsharp 1.50 nó sẽ hoạt động trở lại.

+0

Xin chào, bro. Điều đó không làm việc, tôi đã tải về dự án PDFsharp 1,5 beta3b (phiên bản cuối cùng tôi tìm thấy) và thêm nó vào dự án nhưng hình ảnh vẫn còn có cùng một vấn đề. –

+1

Có, hình ảnh này không được xử lý chính xác, định dạng JPEG lạ. Có vẻ chính xác khi tệp PDF được xem bằng Firefox. Sẽ điều tra thêm trong tuần tới. Nếu bạn phải sử dụng hình ảnh cụ thể này: hãy mở bằng bộ xử lý hình ảnh (ví dụ: MS Paint), sau đó sử dụng Tệp => Lưu dưới dạng và hình ảnh mới sẽ hoạt động với PDFsharp. –

+0

Cảm ơn, @ThomasH, đã giải quyết được vấn đề. Tôi vẫn không biết đây có phải là câu trả lời cuối cùng hay chỉ là một "bản vá" cho câu hỏi này. Nếu bạn đăng bài này như là một câu trả lời tôi vui mừng sẽ đánh dấu nó như là giải pháp. –

0

Hình ảnh của bạn là ảnh JPEG CMYK. Khi nó được nhúng trong tập tin PDF, không gian màu của nó được đặt thành RGB và điều này gây ra sự giải mã không chính xác.
Tôi không biết liệu bạn có thể đặt không gian màu hình ảnh trong mã của bạn thành CMYK hay không hoặc đây có phải là thứ cần được sửa trong PDFsharp hay không.

+0

PDFsharp dựa trên GDI + hoặc WPF để xác định xem JPEG là RGB hay CMYK. –

+0

Bạn có nghĩ rằng chúng tôi nên báo cáo vấn đề này cho các nhà phát triển PDFsharp không? –

+0

Thật không may cả GDI + và WPF đều lỗi khi xử lý các ảnh JPEG CMYK. –

Các vấn đề liên quan