I know this is an old post but I wanted to post the way I got this to work.
No one posting was very helpful.
This is my code using ItextSharp. I hope it's helpful to someone. I needed
to move an existing barcode on the page. Instead what you do is copy the
barcode, delete the existing barcode and place a copy back on the page at an
absolute position.
public class BarcodeMover
{
public void MoveDuploBarcode(string inputfile, string outputfile)
{
using (FileStream outputstreampdf = new FileStream(outputfile,
FileMode.Create))
{
using (PdfReader inputstreampdf = new PdfReader(inputfile))
{
PdfStamper pdfstamper = new PdfStamper(inputstreampdf,
outputstreampdf);
for (int pagenum = 1; pagenum <=
inputstreampdf.NumberOfPages; pagenum++)
{
if (IsEven(pagenum))
{
using (MemoryStream pagememorystream = new
MemoryStream())
{
PdfDictionary pagexobjects =
GetAllXObjectsDictionaryFromPage(inputstreampdf, pagenum);
PdfContentParser pagecontentparser =
GetContentParserForPage(inputstreampdf, pagenum);
PdfName barcodestreamobject = null;
while (true)
{
List<PdfObject> currentstreamobjects =
GetNextSectionOfContent(pagecontentparser);
if (currentstreamobjects.Count == 0)
{
break;
}
bool ismatrixbarcode =
DoesStreamContainMatrixBarcode(currentstreamobjects, pagexobjects);
if (ismatrixbarcode)
{
barcodestreamobject =
(PdfName)currentstreamobjects.First();
}
else
{
WriteToMemoryStream(currentstreamobjects, pagememorystream);
}
}
if (barcodestreamobject != null)
{
PdfObject barcodeobject =
pagexobjects.Get((PdfName)barcodestreamobject);
PdfDictionary xobjectdictionary =
(PdfDictionary)PdfReader.GetPdfObject(barcodeobject);
int xrefIdx =
((PRIndirectReference)barcodeobject).Number;
PdfObject pdfObj =
inputstreampdf.GetPdfObject(xrefIdx);
PdfStream streamobject =
(PdfStream)pdfObj;
byte[] imagestream =
PdfReader.GetStreamBytesRaw((PRStream)streamobject);
PdfReader.KillIndirect(barcodeobject);
ImgCCITT timg =
BuildNewImage(xobjectdictionary, imagestream, inputstreampdf, pagenum);
PlaceNewImageOnPage(pdfstamper, pagenum,
pagememorystream, timg);
barcodestreamobject = null;
}
}
}
}
pdfstamper.Close();
}
}
}
private List<PdfObject> GetNextSectionOfContent(PdfContentParser
pagecontentparser)
{
return pagecontentparser.Parse(null);
}
private bool IsEven(int pagenum)
{
return pagenum % 2 == 0;
}
private void WriteToMemoryStream(List<PdfObject> pagecontentobjects,
MemoryStream memoryStream)
{
foreach (PdfObject o in pagecontentobjects)
{
o.ToPdf(null, memoryStream);
memoryStream.WriteByte((byte)'\n');
}
}
private PdfDictionary GetAllXObjectsDictionaryFromPage(PdfReader
pdfreader, int pagenum)
{
PdfDictionary pagedictionary = pdfreader.GetPageN(pagenum);
PdfDictionary pageresources =
(PdfDictionary)PdfReader.GetPdfObject(pagedictionary.Get(PdfName.RESOURCES));
return
(PdfDictionary)PdfReader.GetPdfObject(pageresources.Get(PdfName.XOBJECT));
}
private PdfContentParser GetContentParserForPage(PdfReader
pdfReader, int pagenum)
{
byte[] pagecontentstream = pdfReader.GetPageContent(pagenum);
return new PdfContentParser(new PRTokeniser(new
RandomAccessFileOrArray(pagecontentstream)));
}
private void PlaceNewImageOnPage(PdfStamper pdfStamper, int i,
MemoryStream memoryStream, ImgCCITT timg)
{
pdfStamper.Reader.SetPageContent(i, memoryStream.GetBuffer());
pdfStamper.GetOverContent(i).AddImage(timg);
}
private ImgCCITT BuildNewImage(PdfDictionary tg, byte[] bytes,
PdfReader pdfReader, int i)
{
double width =
Convert.ToInt32(tg.Get(PdfName.WIDTH).ToString());
double height =
Convert.ToInt32(tg.Get(PdfName.HEIGHT).ToString());
ImgCCITT timg = new ImgCCITT((int)width, (int)height, false,
ImgCCITT.CCITTG4, ImgCCITT.CCITT_ENDOFBLOCK, bytes);
timg.ScaleToFit(24, 24);
timg.SetAbsolutePosition(0, pdfReader.GetPageSize(i).Top - 140);
return timg;
}
private bool DoesStreamContainMatrixBarcode(List<PdfObject>
contentobjects, PdfDictionary pagexobjects)
{
if ("Do".Equals(contentobjects.Last().ToString()) &&
contentobjects.First().ToString().Contains("img"))
{
PdfObject possibleobject =
pagexobjects.Get((PdfName)contentobjects.First());
if (possibleobject.IsIndirect())
{
if (possibleobject != null)
{
PdfDictionary xobjectdictionary =
(PdfDictionary)PdfReader.GetPdfObject(possibleobject);
PdfName type =
(PdfName)PdfReader.GetPdfObject(xobjectdictionary.Get(PdfName.SUBTYPE));
if (PdfName.IMAGE.Equals(type))
{
if
(xobjectdictionary.Get(PdfName.FILTER).ToString() == "/CCITTFaxDecode")
{
return true;
}
}
}
}
}
return false;
}
}
--
View this message in context:
http://itext.2136553.n4.nabble.com/Replacing-and-removing-images-tp2165841p4660872.html
Sent from the iText mailing list archive at Nabble.com.
------------------------------------------------------------------------------
_______________________________________________
iText-questions mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/itext-questions
iText(R) is a registered trademark of 1T3XT BVBA.
Many questions posted to this list can (and will) be answered with a reference
to the iText book: http://www.itextpdf.com/book/
Please check the keywords list before you ask for examples:
http://itextpdf.com/themes/keywords.php