C# 无法使用ITEXTC检测图像对象#
我想更改pdf中现有图像的亮度我的代码如下。当我调试此代码时,只为表单对象运行循环,而不转到xobject字典。在RUP中,它显示在/RESOURCES/XObject/RESOURCES/XObject/Im26:14 0 R中C# 无法使用ITEXTC检测图像对象#,c#,winforms,itext,C#,Winforms,Itext,我想更改pdf中现有图像的亮度我的代码如下。当我调试此代码时,只为表单对象运行循环,而不转到xobject字典。在RUP中,它显示在/RESOURCES/XObject/RESOURCES/XObject/Im26:14 0 R中 public MemoryStream PDFimgChnages(Stream fileStream) { BinaryReader br = new BinaryReader(fileStream); byte[] byt
public MemoryStream PDFimgChnages(Stream fileStream)
{
BinaryReader br = new BinaryReader(fileStream);
byte[] byt = br.ReadBytes((int)fileStream.Length);
MemoryStream ms = new MemoryStream();
using (PdfReader pdf = new PdfReader(byt))
{
if (pdf.IsOpenedWithFullPermissions)
{
using (PdfStamper stp = new PdfStamper(pdf, ms))
{
PdfWriter writer = stp.Writer;
//
int page_count = pdf.NumberOfPages;
for (int i = 1; i <= page_count; i++)
{
PdfDictionary pg = pdf.GetPageN(i);
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)
{
PdfObject obj = xobj.Get(name);
if (obj.IsIndirect())
{
PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
PdfName type = (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
if (PdfName.IMAGE.Equals(type))
{
int xrefIdx = ((PRIndirectReference)obj).Number;
PdfObject pdfObj = pdf.GetPdfObject(xrefIdx);
PdfStream str = (PdfStream)(pdfObj);
byte[] bytes = PdfReader.GetStreamBytesRaw((PRStream)str);
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance((PRIndirectReference)obj);
string filter = tg.Get(PdfName.FILTER).ToString();
if (filter == "/DCTDecode")
{
System.Drawing.Image img2 = System.Drawing.Image.FromStream(new MemoryStream(bytes));
if (img2.Height == 200 && img2.Width == 160)
{
System.Drawing.Bitmap originalImage = (Bitmap)img2;
System.Drawing.Bitmap adjustedImage = (Bitmap)img2;
float brightness = 1.0f; // no change in brightness
float contrast = 2.0f; // twice the contrast
float gamma = 1.0f; // no change in gamma
float adjustedBrightness = brightness - 1.0f;
// create matrix that will brighten and contrast the image
float[][] ptsArray ={
new float[] {contrast, 0, 0, 0, 0}, // scale red
new float[] {0, contrast, 0, 0, 0}, // scale green
new float[] {0, 0, contrast, 0, 0}, // scale blue
new float[] {0, 0, 0, 1.0f, 0}, // don't scale alpha
new float[] {adjustedBrightness, adjustedBrightness, adjustedBrightness, 0, 1}};
ImageAttributes imageAttributes = new ImageAttributes();
imageAttributes.ClearColorMatrix();
imageAttributes.SetColorMatrix(new ColorMatrix(ptsArray), ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
imageAttributes.SetGamma(gamma, ColorAdjustType.Bitmap);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(adjustedImage);
g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, adjustedImage.Width, adjustedImage.Height), 0, 0, originalImage.Width, originalImage.Height, GraphicsUnit.Pixel, imageAttributes);
}
//img2 = Resize(img2);
var stream = new System.IO.MemoryStream();
img2.Save(stream, ImageFormat.Jpeg);
stream.Position = 0;
img = iTextSharp.text.Image.GetInstance(stream);
PdfReader.KillIndirect(obj);
writer.AddDirectImageSimple(img, (PRIndirectReference)obj);
break;
}
}
}
}
}
}
stp.FormFlattening = true;
}
return ms;
}
else
return null;
}
}
在rups中,它显示在/RESOURCES/XObject/RESOURCES/XObject/Im26:14 0 R中,但您的代码只在“/RESOURCES/XObject”中立即查找图像,因此它显然找不到您的Im26。因此,只需重新编写代码就可以更深入地钻研该级别。我还使用此代码查找im26,但循环只运行一次。如果你知道这个问题,那么请帮助@mkl这个问题正是你在说“it show in/RESOURCES/XObject/RESOURCES/XObject/Im26:14 0 R”时提到的,在你的例子中,图像是表单XObject的直接资源,而表单XObject又是页面的资源。另一方面,您链接和显示的代码只查找作为即时页面资源的图像。如果希望示例代码正确处理,请共享示例PDF。如果希望示例代码正确处理,请共享示例PDF。
byte[] bytes = System.IO.File.ReadAllBytes(final);
Stream stream = new MemoryStream(bytes);
pdfImageModification objPIM = new pdfImageModification();
MemoryStream ms = objPIM.PDFimgChnages(stream);
FileStream file = new FileStream(final1, FileMode.Create, FileAccess.Write);
ms.WriteTo(file);