如何将二进制文件中的PDF文件附加到已经正在进行的#39; PDF,使用iTextSharp?

时间:2014-10-28 20:04:58

标签: c# pdf itextsharp

在代码中,我正在使用iTextSharp创建PDF文档。我已经在文档中添加了内容并关闭了文档,并在响应Web浏览器时成功检索了该文档。

我要做的是将另一个PDF文档追加到我正在创建的文档中,但它必须来自二进制文件或Byte[]类型的对象。

我意识到有可用的方法document.Add(stuff),但我试图将二进制文件转换为对象,然后基本上将其添加到正在进行的文档中。我已经看到类似于我的场景的问题和帖子,但他们主要处理图像。

这就是我所拥有的......

while (sqlExpDocDataReader.Read())
{
    // Read data and fill temp. objects
    string docName = sqlExpDocDataReader["docName"].ToString();
    string docType = sqlExpDocDataReader["docType"].ToString();
    Byte[] docData = (Byte[])sqlExpDocDataReader["docData"];

    // Get current page size
    var pageWidth = document.PageSize.Width;
    var pageHeight = document.PageSize.Height;

    // Is this an image or PDF?
    if (docType.Contains("pdf"))
    {
        // Could I use a memeory stream some how?
        MemoryStream ms = new MemoryStream(docData.ToArray());
    }
    else
    {
        // Here I see how to do it with images.
        Image doc = Image.GetInstance(docData);
        doc.ScaleToFit(pageWidth, pageHeight); // width, height
        document.Add(doc);
    }
}

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

通过更多的挖掘,以下是我能够解决我的问题......

基本上,我从二进制数据中创建了一个MemoryStream对象,然后创建了一个PdfReader来读取该对象,通常我们会读取一个文件。 然后,我循环浏览阅读器对象的每一页(或文件,如果你愿意),并将它们添加到找到的位置。

if (docType.Contains("pdf"))
{
    MemoryStream ms = new MemoryStream(docData.ToArray());
    PdfReader pdfReader = new PdfReader(ms);

    for (int i = 1; i <= pdfReader.NumberOfPages; i++)
    {
        PdfImportedPage page = writer.GetImportedPage(pdfReader, i);
        document.Add(iTextSharp.text.Image.GetInstance(page));
    }
}

答案 1 :(得分:0)

public static byte[] UnificarImagenesPDF(IEnumerable<DocumentoDTO> documentos)// "documents" is a list of objects that are located in the database, the images and pdf are stored in a binary attribute of "documents" 
{
 using (MemoryStream workStream = new MemoryStream())
 {
  iTextSharp.text.Document doc = new iTextSharp.text.Document();//to create a itextSharp Document
  PdfWriter writer = PdfWriter.GetInstance(doc, workStream);
  doc.Open();
  foreach (DocumentoDTO d in documentos)// "documentos" has an attribute where the document extension type is saved (eg pdf, jpg, png, etc) 
  {
   try
   {
    if (d.sExtension == ".pdf")
  {
   MemoryStream ms = new MemoryStream(d.bBinarios.ToArray());
   PdfReader pdfReader = new PdfReader(ms); // 
    for (int i = 1; i <= pdfReader.NumberOfPages; i++)
   {
   PdfImportedPage page = writer.GetImportedPage(pdfReader, i);
   doc.Add(resizeImagen(iTextSharp.text.Image.GetInstance(page)));//Each sheet of the PDF document is added to the document created in itextsharp, and the resizeImage function is used so that the images are centered in the ITEXTSHARP document
   doc.NewPage();// add a new page on ITEXTSHARP document
   }
  }
if (d.sExtension != ".pdf")
 {
  doc.Add(resizeImagen(Image.GetInstance((byte[])d.bBinarios)));
  doc.NewPage();
 }
}
 catch
 {  }
}
   doc.Close();
   writer.Close();
   return workStream.ToArray();
}
}

private static iTextSharp.text.Image resizeImagen(iTextSharp.text.Image image)
{
   if (image.Height > image.Width)
   {
   //Maximum height is 800 pixels.
   float percentage = 0.0f;
   percentage = 700 / image.Height;
   image.ScalePercent(percentage * 100);
   }
   else
   {
  //Maximum width is 600 pixels.
  float percentage = 0.0f;
  percentage = 540 / image.Width;
  image.ScalePercent(percentage * 100);
   }
  return image;
}