2012-02-22 13 views
0

開始時に私はCで初心者ですので、忍耐強く:
私はバイトの配列を持っています。 1つの項目がpdfファイルのページを表します。この配列を1つにマージする必要があります。私はこの新しい配列が2つのページを上に表示することを願っています。この場合:
のPage1(アイテムから[0])
ページ2(アイテムから[1])配列内の2バイト以上の項目を1バイト要素にマージする方法

その良いアイデア?私はデータベースを使ってレポートサービスに画像としてpdfを添付する必要があります。


Screen

編集:ここでは

私のコードです:

PDFParser.dllから
System.Collections.ArrayList items = new System.Collections.ArrayList(); 
System.IO.FileStream fs = new System.IO.FileStream("C://1.pdf", System.IO.FileMode.Open, System.IO.FileAccess.Read); 
byte[] pdf = new byte[fs.Length]; 
fs.Read(pdf, 0, (int)fs.Length); 

PDFParser.Parse parser = new PDFParser.Parse(); 
System.Collections.Generic.List<System.Drawing.Image> images = parser.Split(pdf); 

object dataByte = null; 
for (int i = 0; i < images.Count; i++) 
{ 
    System.IO.MemoryStream ms = new System.IO.MemoryStream(); 
    images[i].Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
    items.Add(ms.ToArray()); 
} 

と方法:どのような私

public class Parse 
    { 
     public List<Image> Split(byte[] document) 
     { 
      System.IO.MemoryStream ms = new System.IO.MemoryStream(document); 
      Document pdfDoc = new Document(new BinaryReader(ms)); 
      Page page = null; 
      List<Image> returnVal = new List<Image>(); 

      float resolution = 100; 
      float scale = resolution/72f; 

      int bmpW = (int) (scale * pdfDoc.Pages[0].Width); 
      int bmpH = (int) (scale * pdfDoc.Pages[0].Height); 

      for (int i = 0; i < pdfDoc.Pages.Count; i++) 
      { 
       page = pdfDoc.Pages[i]; 
       using (Bitmap bitmap = new Bitmap(bmpW, bmpH)) 
       { 
        Graphics graphics = Graphics.FromImage(bitmap); 
        graphics.ScaleTransform(scale, scale); 
        graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
        page.Draw(graphics); 
        returnVal.Add((Image)bitmap.Clone()); 
       } 
      } 
      return returnVal; 
     } 
    } 

3'rdパーティプログラム中古品:
http://www.tallcomponents.com/pdfrasterizer3.aspx

+4

私は恐らくこのようにはうまくいかないと思います。あなたが別の車の後ろに1つの車を接着する場合、あなたはリムジンを取得しない、混乱を取得します。 – MattDavey

+0

@MattDavey私は以下の答えの良いアナロジーのために狩りをしていました。私はあなたの2x車を愛しています! – ColinE

答えて

4

これはうまくいきません!表示されるバイト配列は、各PDFページを表すPDFオブジェクトのシリアライズされた形式です。これらの2つをマージすると、有効なPDFドキュメントオブジェクトにデシリアライズできないバイト配列が生成されます。

適切なAPIを使用してドキュメントをまとめて結合するよりも、それぞれのバイト配列を適切なPDF表現に逆シリアル化する必要があります。

2

+1 to ColinEの答え。達成したいエフェクトを実装するには、サードパーティのC#PDFライブラリを使用する必要があります。オープンソースのPDFライブラリへのリンクには、this SO questionまたはthereの回答があります。あなたのコードについては

UPDATE - 1が右別の後に表示されるように、2枚の画像をマージするあなたは、このようGraphicsクラスを使用することができます。

object dataByte = null; 
for (int i = 0; i < images.Count; i++) 
{ 
    System.IO.MemoryStream ms = new System.IO.MemoryStream(); 
    images[i].Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
    items.Add(ms.ToArray()); 
} 

を交換してください

System.IO.MemoryStream ms = new System.IO.MemoryStream(); 

if (images.Count > 0) 
{ 
    int totalHeight = 0; 
    int maxWidth = 0; 
    for (int i = 0; i< images.count; i++) 
    { 
     totalHeight += images[i].Height; 
     if (images[i].Width > maxWidth) 
     { 
      maxWidth = images[i].Width; 
     } 
    } 
    Image mergedImage = new System.Drawing.Bitmap(maxWidth, totalHeight); 
    System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(mergedImage); 
    int heightOffset = 0; 
    for (int i = 0; i< images.Count; i++) 
    { 
     g.DrawImage(images[i],new Point(0, heightOffset)); 
     heightOffset += images[i].Height; 
    } 
    g.Dispose(); // Mandatory! Graphics is using unmanaged resources so it must be disposed explicitly. 
    mergedImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
} 
+0

私は画像を – WooCaSh

+0

にpdfを変更するのに役立つライブラリを使用しています。次に、同じライブラリを使用して、配列内にある2つの画像からPDFを作成することができます。これらの2つの配列をマージしても、良い結果は得られません。ほとんどのファイル形式には、マージされた配列を正しく処理できない特定のヘッダー/フッター構造があります。 –

+0

私は変換する必要はありませんpdf - >画像 - > pdf 私はpdf - >画像のみを欲しいです。私は何かをしなければならない: pdfに2ページがある場合、私はバイトの2つのオブジェクトを取得し、レポートのimageboxに入れる必要があります。問題はここにあります。レポート上に2つのオブジェクトを1つのイメージボックスに配置することはできません。私はpdfが複数のページを持っているときに私が動的なイメージボックスを追加できるようにする解決策を見つけなければなりません。何か案が? – WooCaSh

0

他の誰かが、2つの配列をマージして、次元や要素を気にしたくないものを探している場合:

 private void LoadImage() 
     { 
      string src = string.empty; 
      byte[] mergedImageData = new byte[0]; 

      mergedImageData = MergeTwoImageByteArrays(watermarkByteArray, backgroundImageByteArray); 
      src = "data:image/png;base64," + Convert.ToBase64String(mergedImageData); 
      MyImage.ImageUrl = src; 
     } 

     private byte[] MergeTwoImageByteArrays(byte[] imageBytes, byte[] imageBaseBytes) 
     { 
      byte[] mergedImageData = new byte[0]; 
      using (var msBase = new MemoryStream(imageBaseBytes)) 
      { 
       System.Drawing.Image imgBase = System.Drawing.Image.FromStream(msBase); 
       Graphics gBase = Graphics.FromImage(imgBase); 
       using (var msInfo = new MemoryStream(imageBytes)) 
       { 
        System.Drawing.Image imgInfo = System.Drawing.Image.FromStream(msInfo); 
        Graphics gInfo = Graphics.FromImage(imgInfo); 
        gBase.DrawImage(imgInfo, new Point(0, 0)); 
        //imgBase.Save(Server.MapPath("_____testImg.png"), ImageFormat.Png); 
        MemoryStream mergedImageStream = new MemoryStream(); 
        imgBase.Save(mergedImageStream, ImageFormat.Png); 
        mergedImageData = mergedImageStream.ToArray(); 
        mergedImageStream.Close(); 
       } 
      } 
      return mergedImageData; 
     } 
関連する問題