Hi Paulo,
I modified your example for Appending an empty page at the end of a pdf document to insert pages everywhere the paper format changes between an odd and even page. That way printing on a broken duplex printer does work again.


Is it possible to make the "linear mode" flag of the pdfstampers pdfwriter working?
Is it possible to use pageevents for the task of pageinsertion?
Best regards,
Carsten
package ascii2xml;

/**
 * <p>�berschrift: </p>
 * <p>Beschreibung: </p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Organisation: ApplicationLab.de Oc�-Deutschland GmbH</p>
 * @author unbekannt
 * @version $Revision: 1.4 $ $Date: 2004/09/28 12:55:21 $
 */
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;

import java.awt.Color;

import java.io.*;

import java.util.*;

public class AppendEmptyPage {
  private String infile;
  int pagecount = 0;
  float width, height;
  PdfDictionary lastpage = null;
  public AppendEmptyPage(String infile) {
    this.infile = infile;
  }

  protected void iteratePages(PdfDictionary page, PdfReader pdfreader,
                              ArrayList pageInh,
                              int count_in_leaf, PdfWriter writer) throws
      IOException {
    float curwidth, curheight;

    PdfArray kidsPR = (PdfArray) pdfreader.getPdfObject(page.get(PdfName.KIDS));
    if (kidsPR == null) {

//      if (page.get(PdfName.MEDIABOX) == null) {
//        PdfArray arr = new PdfArray(new float[] {0, 0, PageSize.LETTER.right(),
//                                    PageSize.LETTER.top()});
//        page.put(PdfName.MEDIABOX, arr);
//      }

      PdfArray arr = (PdfArray) page.get(PdfName.MEDIABOX);
      ArrayList arl = arr.getArrayList();
      curwidth = Float.parseFloat(arl.get(2).toString());
      curheight = Float.parseFloat(arl.get(3).toString());
      if ( (pagecount + 1) % 2 == 0) {
        if (Math.abs(curwidth - width) > 60 ||
            Math.abs(curheight - height) > 60) {
          Seitehinzufuegen(page, count_in_leaf, writer, arl);
        }
      }

      /**
       * Bei ungeraden Seiten die Seitenabmessungen speichern
       */
      if ( (pagecount + 1) % 2 == 1) {
        width = curwidth;
        height = curheight;
        lastpage = page;
      }
      pageInh.add(pagecount, page);

      pagecount++;

    }
    else {

      page.put(PdfName.TYPE, PdfName.PAGES);
      ArrayList kids = kidsPR.getArrayList();
      for (int k = 0; k < kids.size(); ++k) {
        PdfDictionary kid = (PdfDictionary) PdfReader.getPdfObject( (
            PRIndirectReference) kids.get(k));
        iteratePages(kid, pdfreader, pageInh, k,
                     writer);
      }

    }

  }

  private void Seitehinzufuegen(PdfDictionary page, int count_in_leaf,
                                PdfWriter writer, ArrayList arl) throws
      IOException {
    System.out.print("aenderung!");
    PdfDictionary parent = (PdfDictionary) PdfReader.getPdfObject(page.
        get(
        PdfName.PARENT));
    PdfArray kids = (PdfArray) PdfReader.getPdfObject(parent.get(PdfName.
        KIDS));
    PdfIndirectReference ref = writer.getPdfIndirectReference();

    kids.getArrayList().add(count_in_leaf, ref);

    PdfDictionary newPage = new PdfDictionary(PdfName.PAGE);

    newPage.merge(lastpage);
    newPage.remove(PdfName.CONTENTS);
    newPage.remove(PdfName.ANNOTS);

//          Set s=newPage.getKeys();
//          Iterator it=s.iterator();
//          while(it.hasNext()){
//            System.out.println("Feld:"+it.next());
//          }
    newPage.put(PdfName.RESOURCES, new PdfDictionary());
    writer.addToBody(newPage, ref);
    PdfNumber count = null;
    while (parent != null) {
      count = (PdfNumber) PdfReader.getPdfObject(parent.get(PdfName.
          COUNT));
//            System.out.println("Seitenzahl:" + count.intValue());
      parent.put(PdfName.COUNT, new PdfNumber(count.intValue() + 1));
      parent = (PdfDictionary) PdfReader.getPdfObject(parent.get(PdfName.
          PARENT));
    }

    System.out.println("Seite:" + (pagecount + 1) + " nr in leaf:" +
                       count_in_leaf +
                       " arl x:" + arl.get(0) + " y:" + arl.get(1) +
                       " width:" + arl.get(2) + " height:" + arl.get(3));
  }

  public void convert2(String outfile) {
    try {
      PdfReader reader = new PdfReader(infile);
      PdfStamper stp = new PdfStamper(reader, new FileOutputStream(outfile));
      stp.setRotateContents(true);

      PdfWriter writer = stp.getWriter();

      writer.setLinearPageMode();
      // writer.setPDFXConformance(writer.PDFX32002);

      ArrayList pageInh = new ArrayList();
      PdfDictionary catalog = reader.getCatalog();
      PdfDictionary rootPages = (PdfDictionary) PdfReader.getPdfObject(catalog.
          get(PdfName.PAGES));

      iteratePages(rootPages, reader, pageInh, 0,
                   writer);
      if ( (pagecount) % 2 == 1) {
        appendemptypageatend(reader, writer);

      }

      stp.close();

      System.out.println("Fim.");
    }
    catch (Exception e) {
      e.printStackTrace(System.out);
    }
  }

  private void appendemptypageatend(PdfReader reader, PdfWriter writer) throws
      IOException {
    System.out.print("Letzte Seite ungerade. Fuege Seite an!");
    PdfDictionary page = reader.getPageN(reader.getNumberOfPages());
    PdfDictionary parent = (PdfDictionary) PdfReader.getPdfObject(page.
        get(
        PdfName.PARENT));
    PdfArray kids = (PdfArray) PdfReader.getPdfObject(parent.get(PdfName.
        KIDS));
    PdfIndirectReference ref = writer.getPdfIndirectReference();

    kids.add(ref);

    PdfDictionary newPage = new PdfDictionary(PdfName.PAGE);

    newPage.merge(lastpage);
    newPage.remove(PdfName.CONTENTS);
    newPage.remove(PdfName.ANNOTS);

    newPage.put(PdfName.RESOURCES, new PdfDictionary());
    writer.addToBody(newPage, ref);
    PdfNumber count = null;
    while (parent != null) {
      count = (PdfNumber) PdfReader.getPdfObject(parent.get(PdfName.
          COUNT));
      parent.put(PdfName.COUNT, new PdfNumber(count.intValue() + 1));
      parent = (PdfDictionary) PdfReader.getPdfObject(parent.get(PdfName.
          PARENT));
    }
  }

  public void setInfile(String infile) {
    this.infile = infile;
  }

  public String getInfile() {
    return infile;
  }

  public static void main(String args[]) {
    String filename = args[0];
    AppendEmptyPage repairedfile = new AppendEmptyPage(filename);
    File bla = new File(filename);

    String outfile = bla.getName().replaceAll(".pdf", " ").trim() + "xyz.pdf";
    System.out.println("Konvertiere " + filename + " nach " + outfile);
    repairedfile.convert2(outfile);

  }

}

Reply via email to