Archive for December 12th, 2007

Why do I get the exception ‘PdfReader not opened with owner password’

When I tried to decrypt a owner password protected PDF(version 1.6) with the last version of itext yesterday, I got the exception, “PdfReader not opened with owner password”, then I tried to use my native version pdfdecrypt.exe(base on iText 1.46) and pdftk , it said the PDF version does not supports. so I had to google the result, then I got the answer,

Paulo Soares said,
From iText version 2.0.3 and iTextSharp 4.0.4 the password restrictions are enforced by the library instead of passing that responsability to the developer. Using PdfStamper or importing pages in PdfStamper, PdfCopy and PdfWriter will throw an exception if the PDF was not opened with the owner password.

then I tried iText 2.0.2, it works.

btw, I also find another solution from PDFSharp, and I notice a very interesting comment,

PDFsharp doesn’t try to protect the document because this make little sence for an open source library.

so why PdfReader try to protect the PDF?

Share and Enjoy:
  • Digg
  • del.icio.us
  • Netvouz
  • DZone
  • ThisNext
  • MisterWong
  • Wists
  • BlinkList
  • blogmarks
  • blogtercimlap
  • connotea
  • DotNetKicks
  • Fark
  • Fleck
  • Gwar
  • Haohao
  • IndianPad
  • Internetmedia
  • LinkaGoGo
  • MyShare
  • Netscape
  • NewsVine
  • Rec6
  • Reddit
  • Scoopeo
  • Slashdot
  • StumbleUpon
  • Technorati
  • Webride

How to replace images in a PDF?

Here’s the code to replace images in PDFs, in Java and C#. It will replace the first image in the first page.

PdfReader pdf = new PdfReader("in.pdf");
PdfStamper stp = new PdfStamper(pdf, new FileOutputStream("c:\\out.pdf"));
PdfWriter writer = stp.getWriter();
Image img = Image.getInstance("image.png");
PdfDictionary pg = pdf.getPageN(1);
PdfDictionary res =
  (PdfDictionary)PdfReader.getPdfObject(pg.get(PdfName.RESOURCES));
PdfDictionary xobj =
  (PdfDictionary)PdfReader.getPdfObject(res.get(PdfName.XOBJECT));
if (xobj != null) {
  for (Iterator it = xobj.getKeys().iterator(); it.hasNext(); ) {
    PdfObject obj = xobj.get((PdfName)it.next());
    if (obj.isIndirect()) {
      PdfDictionary tg = (PdfDictionary)PdfReader.getPdfObject(obj);
      PdfName type =
        (PdfName)PdfReader.getPdfObject(tg.get(PdfName.SUBTYPE));
      if (PdfName.IMAGE.equals(type)) {
        PdfReader.killIndirect(obj);
        Image maskImage = img.getImageMask();
        if (maskImage != null)
          writer.addDirectImageSimple(maskImage);
        writer.addDirectImageSimple(img, (PRIndirectReference)obj);
        break;
      }
    }
  }
}
stp.close();
PdfReader pdf = new PdfReader("in.pdf");
PdfStamper stp = new PdfStamper(pdf, new FileStream("out.pdf",
FileMode.Create));
PdfWriter writer = stp.Writer;
Image img = Image.GetInstance("image.png");
PdfDictionary pg = pdf.GetPageN(1);
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)) {
      PdfReader.KillIndirect(obj);
      Image maskImage = img.ImageMask;
      if (maskImage != null)
        writer.AddDirectImageSimple(maskImage);
        writer.AddDirectImageSimple(img, PRIndirectReference)obj);
        break;
      }
    }
  }
}
stp.Close();

From:http://itext.ugent.be/library/question.php?id=66

Share and Enjoy:
  • Digg
  • del.icio.us
  • Netvouz
  • DZone
  • ThisNext
  • MisterWong
  • Wists
  • BlinkList
  • blogmarks
  • blogtercimlap
  • connotea
  • DotNetKicks
  • Fark
  • Fleck
  • Gwar
  • Haohao
  • IndianPad
  • Internetmedia
  • LinkaGoGo
  • MyShare
  • Netscape
  • NewsVine
  • Rec6
  • Reddit
  • Scoopeo
  • Slashdot
  • StumbleUpon
  • Technorati
  • Webride