Witam, Używam biblioteki iTextSharp do watermarkowania pdf-ów, i wygląda to następująco:
* pathFrom - ścieżka do pliku PDF źródłowego
* outputPath - ścieżka do docelowego pliku
* tmpFolder - przygotowany folder tymczasowy
PdfReader reader = new PdfReader(pathFrom);
using (PdfStamper stamper = new PdfStamper(reader, new FileStream(outputPath, FileMode.CreateNew)))
{
AddImagesWatermark(reader, tmpFolder)
stamper.Close();
}
reader.Close();
/** Wyszukujemy wszystkie obrazki w zasobach pliku PDF */
List<PdfObject> imageObjects = findAllImagesInsidePdfResources(pdf, temporaryDirPath);
Czy poniższy kod jest błędny i to on odwraca kolory ?? Ja już sam nie wiem
/** Równolegle przechodzę przez strony w PDF i wyszukuję "resource" typu "IMAGE", które potencjalnie można zwatermarkować */
private static List<PdfObject> findAllImagesInsidePdfResources(PdfReader pdf, string temporaryDirPath)
{
List<PdfObject> imageObjects = new List<PdfObject>(4096);
Parallel.For(1, pdf.NumberOfPages + 1, 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)
{
Parallel.ForEach(xobj.Keys, name =>
{
PdfObject obj = xobj.Get(name);
if (obj.IsIndirect())
{
PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
if (tg != null)
{
PdfName objectType = (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
if (PdfName.IMAGE.Equals(objectType))
{
PdfName filter = (PdfName)tg.Get(PdfName.FILTER);
if (filter != null && PdfName.DCTDECODE.Equals(filter))
{
imageObjects.Add(obj);
}
}
}
}
});
}
});
return imageObjects;
}
po wrzuceniu image do folderu temp, kolory na większości zdjęć są odwrócone. Wykrywane są one przez inne metody jako ICC Base, jpg.
foreach (var obj in imageObjects)
{
try
{
PdfStream str = (PdfStream)pdf.GetPdfObject(((PRIndirectReference)obj).Number);
PdfImageObject pdfImage = new PdfImageObject((PRStream)str);
System.Drawing.Image image = pdfImage.GetDrawingImage();
String temporaryImagePath = temporaryDirPath + "\\tempIn" + watermarkedImgCount + ".jpg";
image.Save(temporaryImagePath);
String outputImgPath = temporaryDirPath + "\\tempOut" + watermarkedImgCount + ".jpg";
}
catch (Exception e)
{
errorMessage = "Cannot watermark pdf image: " + e.Message;
log.Error("PDFWatermarkImage: Exception: " + e.Message, e);
}