2015-08-20 51 views
0

我嘗試使用PDFClown 0.1.2.0創建一個包含圖像的PDF文件。
但我無法讓它工作。如何使用PDFClown添加圖像?

我得到的錯誤是:

An attempt was made to move the file pointer before the beginning of the file. 

     at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
     at System.IO.FileStream.SeekCore(Int64 offset, SeekOrigin origin) 
     at System.IO.FileStream.Seek(Int64 offset, SeekOrigin origin) 
     at org.pdfclown.documents.contents.entities.JpegImage.Load() 
     at org.pdfclown.documents.contents.entities.Image.Get(Stream stream) 
     at org.pdfclown.documents.contents.entities.Image.Get(String path) 
     at TestPdf.MainForm.createPDF() in c:\Users\Demo\Documents\SharpDevelop Projects\TestPdf\TestPdf\MainForm.cs:line 43 

的代碼,我得到這個錯誤該生產線是:

org.pdfclown.documents.contents.entities.Image image = org.pdfclown.documents.contents.entities.Image.Get("test.jpg"); 

的 「test.jpg放在」 我用的是:enter image description here

我使用的代碼是:

public void createPDF() 
    { 
     try { 
      org.pdfclown.files.File file = new org.pdfclown.files.File(); 
      org.pdfclown.documents.Document document = file.Document; 
      org.pdfclown.documents.Page page = new org.pdfclown.documents.Page(document); 
      document.Pages.Add(page); 
      org.pdfclown.documents.contents.composition.PrimitiveComposer composer = new org.pdfclown.documents.contents.composition.PrimitiveComposer(page); 
      composer.SetFont(new org.pdfclown.documents.contents.fonts.StandardType1Font(document, org.pdfclown.documents.contents.fonts.StandardType1Font.FamilyEnum.Courier, true, false), 32); 
      composer.ShowText("Hello World!", new System.Drawing.PointF(32, 48));    
      org.pdfclown.documents.contents.entities.Image image = org.pdfclown.documents.contents.entities.Image.Get("test.jpg"); 
      org.pdfclown.documents.contents.xObjects.XObject imageXObject = image.ToXObject(document); 
      composer.ShowXObject(imageXObject, new System.Drawing.PointF(32, 80)); 
      composer.Flush(); 
      file.Save("test.pdf", org.pdfclown.files.SerializationModeEnum.Incremental);    
      System.Diagnostics.Process.Start("explorer", System.IO.Directory.GetParent(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).ToString()); 
     } catch (System.Exception e) { 
      System.Windows.Forms.MessageBox.Show(e.Message + "\r\n" + e.StackTrace); 
     } 
    } 

我在做什麼錯?

回答

1

問題是,PdfClown無法處理以漸進模式保存的jpg文件。解決問題的最簡單方法是將jpg文件保存爲非漸進式。

另一種方法是將文件轉換:

public void createPDF() 
    { 
     try { 
      org.pdfclown.files.File file = new org.pdfclown.files.File(); 
      org.pdfclown.documents.Document document = file.Document; 
      org.pdfclown.documents.Page page = new org.pdfclown.documents.Page(document); 
      document.Pages.Add(page); 
      org.pdfclown.documents.contents.composition.PrimitiveComposer composer = new org.pdfclown.documents.contents.composition.PrimitiveComposer(page); 
      composer.SetFont(new org.pdfclown.documents.contents.fonts.StandardType1Font(document, org.pdfclown.documents.contents.fonts.StandardType1Font.FamilyEnum.Courier, true, false), 32); 
      composer.ShowText("Hello World!", new System.Drawing.PointF(32, 48));    
      org.pdfclown.documents.contents.entities.Image image = LoadImageFile("test.jpg"); 
      org.pdfclown.documents.contents.xObjects.XObject imageXObject = image.ToXObject(document); 
      composer.ShowXObject(imageXObject, new System.Drawing.PointF(32, 80));    
      composer.Flush(); 
      file.Save("test.pdf", org.pdfclown.files.SerializationModeEnum.Incremental); 
      System.Diagnostics.Process.Start("explorer", System.IO.Directory.GetParent(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).ToString()); 
     } catch (System.Exception e) { 
      System.Windows.Forms.MessageBox.Show(e.Message + "\r\n" + e.StackTrace); 
     } 
    } 

    public org.pdfclown.documents.contents.entities.Image LoadImageFile(string path) 
    { 
     System.Drawing.Image image = System.Drawing.Image.FromFile(path); 
     var ep = new System.Drawing.Imaging.EncoderParameters(3); 
     ep.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
     ep.Param[1] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.ScanMethod, (int)System.Drawing.Imaging.EncoderValue.ScanMethodInterlaced); 
     ep.Param[2] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.RenderMethod, (int)System.Drawing.Imaging.EncoderValue.RenderNonProgressive); 
     System.IO.MemoryStream memStream = new System.IO.MemoryStream(); 

     System.Drawing.Imaging.ImageCodecInfo encoder_info = null; 
     int j; 
     System.Drawing.Imaging.ImageCodecInfo[] encoders; 
     encoders = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders(); 
     for (j = 0; j < encoders.Length; ++j) { 
      if (encoders[j].MimeType.Equals("image/jpeg")) 
       encoder_info = encoders[j]; 
     } 

     image.Save(memStream, encoder_info, ep); 
     memStream.Position = 0; 
     return org.pdfclown.documents.contents.entities.Image.Get(memStream); 
    } 

方法LoadImageFile打開在C#的圖像,並且將其轉換爲JPG非漸進文件。
這個非漸進式jpg文件被保存到pdf文檔中。
這也適用於png和tiff。