2011-12-22 2 views
3

Я попытался несколько способов сделать это, но все равно не могу его получить. Кажется, iTextSharp требует 2-х прохода, чтобы изображение появилось поверх текста. Итак, я пытаюсь сделать это с использованием потоков памяти, но я продолжаю получать ошибки.Использование PDF itextSharp можно поместить изображение поверх текста при создании pdf-документа

Public Function createDoc(ByRef reqResponse As HttpResponse) As Boolean 

     Dim m As System.IO.MemoryStream = New System.IO.MemoryStream() 
     Dim document As Document = New Document() 
     Dim writer As PdfWriter = iTextSharp.text.pdf.PdfWriter.GetInstance(document, m) 
     document.Open() 
     document.Add(New Paragraph(DateTime.Now.ToString())) 
     document.Add(New Paragraph(DateTime.Now.ToString())) 
     document.Add(New Paragraph(DateTime.Now.ToString())) 
     document.Add(New Paragraph(DateTime.Now.ToString())) 
     document.Add(New Paragraph(DateTime.Now.ToString())) 
     document.Add(New Paragraph(DateTime.Now.ToString())) 
     document.Add(New Paragraph(DateTime.Now.ToString())) 
     document.Close() 
     writer.Flush() 
     writer.Flush() 
     'yes; I get the pdf if this is the last statement 
     'reqResponse.OutputStream.Write(m.GetBuffer(), 0, m.GetBuffer().Length) 

     'this statment does not work it says the stream is closed 
     'm.Position = 0 
     Dim Reader As PdfReader = New PdfReader(m) 
     'Dim rm As MemoryStream = New MemoryStream(m.GetBuffer(), 0, m.GetBuffer().Length) 
     Dim PdfStamper As PdfStamper = New PdfStamper(Reader, reqResponse.OutputStream) 
     Dim cb As iTextSharp.text.pdf.PdfContentByte = Nothing 
     cb = PdfStamper.GetOverContent(1) 
     Dim locMyImage As System.Drawing.Image = System.Drawing.Image.FromStream(zproProduceWhiteImageToCovertBarCodeNumbers()) 
     Dim BImage As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(locMyImage, iTextSharp.text.BaseColor.CYAN) 
     Dim overContent As PdfContentByte = PdfStamper.GetOverContent(1) 
     BImage.SetAbsolutePosition(5, 5) 
     overContent.AddImage(BImage) 
     PdfStamper.FormFlattening = True 
     PdfStamper.Close() 

     'rm.Flush() 
     'rm.Close() 
     'Dim data As Byte() = rm.ToArray() 

     'reqResponse.Clear() 
     'Dim finalMs As MemoryStream = New MemoryStream(data) 
     'reqResponse.ContentType = "application/pdf" 
     'reqResponse.AddHeader("content-disposition", "attachment;filename=labtest.pdf") 
     'reqResponse.Buffer = True 
     'finalMs.WriteTo(reqResponse.OutputStream) 
     'reqResponse.End() 


     'Dim data As Byte() = rm.ToArray() 
     'reqResponse.OutputStream.Write(data, 0, data.Length) 

     ''Response.OutputStream.Write(m.GetBuffer(), 0, m.GetBuffer().Length); 
     ''Response.OutputStream.Flush(); 
     ''Response.OutputStream.Close(); 
     ''Response.End(); 


     HttpContext.Current.ApplicationInstance.CompleteRequest() 
     Return True 
    End Function 

ссылка: Put text on top of an image?

ссылка Seach двигателя: Whiteout текст на PDF-документа, используя изображение, которое имеет тот же цвет, как изображения перекрываются фон PDF с itextpdf itextsharp изображения на вершине текст Whiteout itextsharp место изображение на верхней части текста itextpdf изображение сверху

спасибо, Doug Lubey из Louisiana

Example of my final product

+0

Скриншот выше выглядит как [PDF редакции] (http://blogs.adobe.com/security/2009/12/how_to_properly_redact_pdf_fil.html). Надеюсь, это не ваше намерение; даже iText [Sharp] может восстановить текст из созданного таким образом PDF-файла. [Одна ссылка] (http://www.mail-archive.com/[email protected]/msg58936.html) и [еще] (http://www.mail-archive.com/itext- [email protected]/msg57640.html) из списка рассылки, в котором объясняется, что проще использовать другой инструмент для ** правильной ** редакции. (человек, который дал ответы в обеих нитях для Adobe и является экспертом в формате PDF **) – kuujinbo

ответ

8

Вы можете сделать это довольно легко. Объект Document является вспомогательным объектом, который абстрагирует многие внутренние функции модели PDF и по большей части предполагает, что вы хотите передать содержимое, и этот текст будет отображаться выше изображений. Если вы хотите обойти это, вы можете напрямую поговорить с объектом PdfWriter. Он имеет два свойства: DirectContent и DirectContentUnder, которые имеют методы с именем AddImage(), которые вы можете использовать для установки абсолютной позиции на изображении. DirectContent находится над существующим контентом, а DirectContentUnder находится под ним. См. Код для примера:

Вы, кажется, делаете это в Интернете, поэтому вам нужно будет адаптировать это к любому потоку, который вы используете, но это должно быть довольно легко.

Одно замечание, НИКОГДА НЕ вызов GetBuffer() на MemoryStream, ВСЕГДА использование ToArray(). Первый метод включает в себя неинициализированные байты, которые дадут вам потенциально поврежденные PDF-файлы.

''//File that we are creating 
    Dim OutputFile As String = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf") 
    ''//Image to place 
    Dim SampleImage As String = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "SampleImage.jpg") 

    ''//Standard PDF creation setup 
    Using FS As New FileStream(OutputFile, FileMode.Create, FileAccess.Write, FileShare.None) 
     Using Doc As New Document(PageSize.LETTER) 
      Using writer = PdfWriter.GetInstance(Doc, FS) 

       ''//Open the document for writing 
       Doc.Open() 
       ''//Add a simple paragraph 
       Doc.Add(New Paragraph("Hello world")) 

       ''//Create an image object 
       Dim Img = iTextSharp.text.Image.GetInstance(SampleImage) 
       ''//Give it an absolute position in the top left corner of the document (remembering that 0,0 is bottom left, not top left) 
       Img.SetAbsolutePosition(0, Doc.PageSize.Height - Img.Height) 
       ''//Add it directly to the raw pdfwriter instead of the document helper. DirectContent is above and DirectContentUnder is below 
       writer.DirectContent.AddImage(Img) 

       ''//Close the document 
       Doc.Close() 
      End Using 
     End Using 
    End Using 
+0

Благодарю вас ... Спасибо ... Спасибо ... Санта пришел рано. –