Enviada: Ter Jun 15, 2010 12:12 pm Assunto: Extrair imagem TIFF de um PDF
Estou desenvolvendo uma aplicação em C# (Asp.Net) onde existem pdfs salvos no servidor e os usuarios podem visualizá-los. tenho que dar a opção ao usuário de rotacionar o pdf que está sendo exibido, porém ele pode salvar a alteração no servidor, sem fazer download. Tentei rotacionar o pdf inteiro usando itextsharp, porém não tive sucesso. Então parti para a idéia de extrair a imagem de dentro do pdf, rotacioná-la e depois salvar em um outro pdf, que iria substituir o original. O problema neste caso foi quando o pdf contém uma imagem tiff dentro dele. Fiz o tratamento da tiff mas não funciona. Segue o código. Se alguém souber como resolver este problema da tiff, ou tiver alguma outra solução, agradeço desde já.
bytes - já são os bytes do arquivo que está dentro do pdf.
Código:
using (System.IO.MemoryStream memStream = new System.IO.MemoryStream(bytes))
{
TiffBitmapDecoder MyDecoder = new TiffBitmapDecoder(memStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
antes de mais nada... vc já testou seu código com uma imagem TIFF pura (sem ser extraída) . pode ser que no momento da extração não esteja sendo enviado como base 64 (se nao me falha a memória esta e a codificação da imagem tiff, posso estar enganado)
Outra coisa... a muito tempo atrás eu fuz algo semelhante mas eu tinha o instalador do Componente Imaging da Kodak ... e instalava este componente antes de fazer qquer alteração em imagem do tipo Tiff.
Ele funciona bem, apesar de ser um componente antigo ..rs
Quando eu uso uma tif direto dá certo. Só não dá certo quando é extraido do pdf.
Tentei fazer a conversão para a base 64 mas não funcionou. Vc tem algum exemplo que faz essa conversão ??
Não deu certo converter, não sei se está faltando alguma coisa, já to sem ideias. Segue o código completo, é meio grande pq to usando o itextsharp.
Se vc conseguir identificar o que está faltando, eu agradeço muito
valeu.
Código:
public void carregaPDF(byte[] arrBytes)
{
MemoryStream s = new MemoryStream(arrBytes);
String outputPath = "C:\\";
PdfReader pdf = new PdfReader(arrBytes);
RandomAccessFileOrArray raf = new iTextSharp.text.pdf.RandomAccessFileOrArray(arrBytes);
try
{
for (int pageNumber = 1; pageNumber <= pdf.NumberOfPages; pageNumber++)
{
PdfDictionary pg = pdf.GetPageN(pageNumber);
PdfDictionary res =
(PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
PdfDictionary xobj =
(PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
if (xobj != null)
{
foreach (PdfName name in xobj.Keys)
{
String temp = @"\\10.1.1.7\intersap_tudo\mac_images\imagens\1\processos_new\20\temp";
if (!Directory.Exists(temp))
Directory.CreateDirectory(temp);
iTextSharp.text.Document doc = new iTextSharp.text.Document();
PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(temp + "\\00000000.pdf", FileMode.Create));
doc.Open();
PdfPTable table = new PdfPTable(1);
table.AddCell(iTextSharp.text.Image.GetInstance(img, ImageFormat.Jpeg));
doc.Add(table);
doc.Close();
// Mostra o pdf rotacionado na tela
StreamReader reader = new StreamReader(temp + "\\00000000.pdf");
BinaryReader binaryReader = new BinaryReader(reader.BaseStream);
int x = (int)reader.BaseStream.Length;
byte[] bytesPDF = binaryReader.ReadBytes(x);
setImage(bytesPDF);
reader.Dispose();
//Exclui a pasta temporária
//Directory.Delete(temp, true);