2013-04-11 69 views
0

我正在尝试使用以下方法将图像追加到现有PDF。使用iTextSharp将图像追加到PDF页面

public static byte[] Append(byte[] inputPdf, params Image[] images) 
{ 
    var ms = new MemoryStream(); 
    ms.Write(inputPdf, 0, inputPdf.Length); 
    ms.Seek(0, SeekOrigin.Begin); 

    using (Document pdf = new Document(iTextSharp.text.PageSize.A4, 10, 10, 10, 10)) 
    using (PdfWriter writer = PdfWriter.GetInstance(pdf, ms)) 
    { 
     pdf.Open(); 
     foreach (var image in images) 
     { 

      var result = pdf.NewPage(); 

      ImageFormat format = image.PixelFormat == PixelFormat.Format1bppIndexed 
       || image.PixelFormat == PixelFormat.Format4bppIndexed 
       || image.PixelFormat == PixelFormat.Format8bppIndexed 
       ? ImageFormat.Tiff 
       : ImageFormat.Jpeg; 
      var pdfImage = iTextSharp.text.Image.GetInstance(image, format); 
      pdfImage.Alignment = Element.ALIGN_CENTER; 
      pdfImage.ScaleToFit(pdf.PageSize.Width, pdf.PageSize.Height); 
      pdf.Add(pdfImage); 
     } 
     pdf.Close(); 
    } 
    ms.Flush(); 
    return ms.GetBuffer(); 
} 

result值没有使用,我正在调试它。该值始终为真,因此添加页面正在工作。

生成的PDF与原始大小相同,但不可读。打开时出现无效的根对象错误。

有什么建议吗?

感谢

+0

当与现有的PDF工作,你需要使用一个PdfStamper,请参阅[如何在现有PDF中插入iTextSharp图像?](http://stackoverflow.com/questions/583629/how-can-i-insert-an-image-with-itextsharp-in- an-existing-pdf) – 2013-04-11 13:02:57

回答

1

方法1(不PdfStamper)

using (var ms = new MemoryStream()) 
{ 
     var pdf = new PdfReader(inputPdf); 
     var doc = new Document(pdf.GetPageSizeWithRotation(1)); 
     using (var writer = PdfWriter.GetInstance(doc, ms)) 
     { 
      doc.Open(); 

      for (int page = 0; page < pdf.NumberOfPages; page++) 
      { 
       doc.SetPageSize(pdf.GetPageSizeWithRotation(page + 1)); 
       doc.NewPage(); 
       var pg = writer.GetImportedPage(pdf, page + 1); 
       int rotation = pdf.GetPageRotation(page + 1); 
       if (rotation == 90 || rotation == 270) 
        writer.DirectContent.AddTemplate(
         pg, 0, -1f, 1f, 0, 0, pdf.GetPageSizeWithRotation(page).Height); 
       else 
        writer.DirectContent.AddTemplate(pg, 1f, 0, 0, 1f, 0, 0); 
      } 
      foreach (var image in images) 
      { 
       doc.NewPage(); 

       ImageFormat format = image.PixelFormat == PixelFormat.Format1bppIndexed 
            || image.PixelFormat == PixelFormat.Format4bppIndexed 
            || image.PixelFormat == PixelFormat.Format8bppIndexed 
             ? ImageFormat.Tiff 
             : ImageFormat.Jpeg; 
       var pdfImage = iTextSharp.text.Image.GetInstance(image, format); 
       pdfImage.Alignment = Element.ALIGN_CENTER; 
       pdfImage.ScaleToFit(doc.PageSize.Width - 10, doc.PageSize.Height - 10); 
       doc.Add(pdfImage); 
      } 
      doc.Close(); 
      writer.Close(); 
     } 
     ms.Flush(); 
     return ms.GetBuffer(); 
} 

方法2(使用PdfStamper)

var pdfReader = new PdfReader(inputPdf); 
using (var ms = new MemoryStream()) 
{ 
     using (var stamp = new PdfStamper(pdfReader, ms)) 
     { 
      foreach (var image in images) 
      { 
       var size = pdfReader.GetPageSize(1); 
       var page = pdfReader.NumberOfPages + 1; 
       stamp.InsertPage(page, pdfReader.GetPageSize(1)); 
       ImageFormat format = image.PixelFormat == PixelFormat.Format1bppIndexed 
            || image.PixelFormat == PixelFormat.Format4bppIndexed 
            || image.PixelFormat == PixelFormat.Format8bppIndexed 
             ? ImageFormat.Tiff 
             : ImageFormat.Jpeg; 
       var pdfImage = iTextSharp.text.Image.GetInstance(image, format); 
       pdfImage.Alignment = Element.ALIGN_CENTER; 
       pdfImage.SetAbsolutePosition(0, size.Height - pdfImage.Height); 
       pdfImage.ScaleToFit(size.Width, size.Height); 
       stamp.GetOverContent(page).AddImage(pdfImage); 
      } 
     } 
     ms.Flush(); 
     return ms.GetBuffer(); 
} 
0

你做出错误的假设,即你可以粘上两个PDF文件的字节在一起。

你有一个PDF,看起来像这样:

%PDF-1.6 
%âãÏÓ 
1 0 obj << 
... PDF syntax 
%%EOF 

随着一个又一个,看起来像这样:

%PDF-1.6 
%âãÏÓ 
1 0 obj << 
... PDF syntax 
%%EOF 

在文件中得到的,看起来像这样:

%PDF-1.6 
%âãÏÓ 
1 0 obj << 
... PDF syntax 
%%EOF 
%PDF-1.6 
%âãÏÓ 
1 0 obj << 
... PDF syntax 
%%EOF 

你真的不应该期望这个工作!请首先阅读我的书chapter 6并阅读有关称为PdfStamper的信息。然后去到这样一个问题:How can I insert an image with iTextSharp in an existing PDF?

+0

我正在尝试将新页面添加到PDF中,而不是在PDF上标记现有页面。 – Jim 2013-04-12 05:10:34

+0

我知道,但你仍然需要PdfStamper和它的insertPage()方法(阅读免费章节的6.3.4节)。您当然不希望将一个文件的字节连接到另一个文件的字节。 – 2013-04-12 07:07:45

相关问题