Impressao de applet assinada

Pessoal,

Criei uma applet baseada na classe DocumentRender, listada logo abaixo. A função dela é imprimir uma url. O que fiz:
Adaptei a classe abaixo para ser uma applet.
Gerei um jar correspondente
Gerei a chave pelo keytool
assinei o jar com o jarsigner
exportei com keytool - export (não sei se é necessário tal passo)
quando executei a applet (por html ou appletviewer) deu erro de access denied da runtimeException.

Tentei também configurar a ferramenta policytool do java, mas não obtive sucesso. Alguém pode sugerir algo?

aí vai a classe Impressao

[color=green]
import java.applet.;
import java.awt.
;
import java.awt.print.;
import java.io.
;
import javax.swing.;
import javax.swing.text.
;
import javax.swing.text.html.*;

public class Impressao extends Applet implements Printable {
public void imprimePagina(String url) {
JEditorPane jed = null;
try {
jed = new JEditorPane(url);
} catch (IOException e) {
e.printStackTrace();
}
Impressao gerador = new Impressao();
gerador.print(jed);
}

public String testaApplet(){
return “Applet respondeu!”;
}

/*

  • public static void main(String[] args) { JEditorPane jed = null; try {
  • jed = new JEditorPane(“http://www.google.com.br”); } catch (IOException
  • e) { e.printStackTrace(); } DocumentRender gerador = new
  • DocumentRender();
  • gerador.print(jed);
  • }
    /
    protected int currentPage = -1; // Used to keep track of when
    // the page to print changes.
    protected JEditorPane jeditorPane; // Container to hold the
    // Document. This object will
    // be used to lay out the
    // Document for printing.
    protected double pageEndY = 0; // Location of the current page
    // end.
    protected double pageStartY = 0; // Location of the current page
    // start.
    protected boolean scaleWidthToFit = true; // boolean to allow control over
    // whether pages too wide to fit
    // on a page will be scaled.
    /
  • The DocumentRenderer class uses pFormat and pJob in its methods. Note
  • that pFormat is not the variable name used by the print method of the
  • DocumentRenderer. Although it would always be expected to reference the
  • pFormat object, the print method gets its PageFormat as an argument.
    */
    protected PageFormat pFormat;
    protected PrinterJob pJob;

/*

  • The constructor initializes the pFormat and PJob variables.
    */

public Impressao() {
pFormat = new PageFormat();
pJob = PrinterJob.getPrinterJob();
}

public static void deletaArquivo(File inFile) {
if (inFile.isFile()) {
inFile.delete();
}

}
/*

  • Method to get the current Document
    */
    public Document getDocument() {
    if (jeditorPane != null)
    return jeditorPane.getDocument();
    else
    return null;
    }

/*

  • Method to get the current choice the width scaling option.
    */
    public boolean getScaleWidthToFit() {
    return scaleWidthToFit;
    }

/*

  • pageDialog() displays a page setup dialog.
    */
    public void pageDialog() {
    pFormat = pJob.pageDialog(pFormat);
    }

/*

  • The print method implements the Printable interface. Although Printables
  • may be called to render a page more than once, each page is painted in
  • order. We may, therefore, keep track of changes in the page being
  • rendered by setting the currentPage variable to equal the pageIndex, and
  • then comparing these variables on subsequent calls to this method. When
  • the two variables match, it means that the page is being rendered for the
  • second or third time. When the currentPage differs from the pageIndex, a
  • new page is being requested.
  • The highlights of the process used print a page are as follows:
  • I. The Graphics object is cast to a Graphics2D object to allow for
  • scaling. II. The JEditorPane is laid out using the width of a printable
  • page. This will handle line breaks. If the JEditorPane cannot be sized at
  • the width of the graphics clip, scaling will be allowed. III. The root
  • view of the JEditorPane is obtained. By examining this root view and all
  • of its children, printView will be able to determine the location of each
  • printable element of the document. IV. If the scaleWidthToFit option is
  • chosen, a scaling ratio is determined, and the graphics2D object is
  • scaled. V. The Graphics2D object is clipped to the size of the printable
  • page. VI. currentPage is checked to see if this is a new page to render.
  • If so, pageStartY and pageEndY are reset. VII. To match the coordinates
  • of the printable clip of graphics2D and the allocation rectangle which
  • will be used to lay out the views, graphics2D is translated to begin at
  • the printable X and Y coordinates of the graphics clip. VIII. An
  • allocation Rectangle is created to represent the layout of the Views.
  • The Printable Interface always prints the area indexed by reference to
  • the Graphics object. For instance, with a standard 8.5 x 11 inch page
  • with 1 inch margins the rectangle X = 72, Y = 72, Width = 468, and Height =
  • 648, the area 72, 72, 468, 648 will be painted regardless of which page
  • is actually being printed.
  • To align the allocation Rectangle with the graphics2D object two things
  • are done. The first step is to translate the X and Y coordinates of the
  • graphics2D object to begin at the X and Y coordinates of the printable
  • clip, see step VII. Next, when printing other than the first page, the
  • allocation rectangle must start laying out in coordinates represented by
  • negative numbers. After page one, the beginning of the allocation is
  • started at minus the page end of the prior page. This moves the part
  • which has already been rendered to before the printable clip of the
  • graphics2D object.
  • X. The printView method is called to paint the page. Its return value
  • will indicate if a page has been rendered.
  • Although public, print should not ordinarily be called by programs other
  • than PrinterJob.
    */
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
    double scale = 1.0;
    Graphics2D graphics2D;
    View rootView;
    // I
    graphics2D = (Graphics2D) graphics;
    // II
    jeditorPane
    .setSize((int) pageFormat.getImageableWidth(), Integer.MAX_VALUE);
    jeditorPane.validate();
    // III
    rootView = jeditorPane.getUI().getRootView(jeditorPane);
    // IV
    if ((scaleWidthToFit)
    && (jeditorPane.getMinimumSize().getWidth() > pageFormat
    .getImageableWidth())) {
    scale = pageFormat.getImageableWidth()
    / jeditorPane.getMinimumSize().getWidth();
    graphics2D.scale(scale, scale);
    }
    // V
    graphics2D.setClip((int) (pageFormat.getImageableX() / scale),
    (int) (pageFormat.getImageableY() / scale), (int) (pageFormat
    .getImageableWidth() / scale), (int) (pageFormat
    .getImageableHeight() / scale));
    // VI
    if (pageIndex > currentPage) {
    currentPage = pageIndex;
    pageStartY += pageEndY;
    pageEndY = graphics2D.getClipBounds().getHeight();
    }
    // VII
    graphics2D.translate(graphics2D.getClipBounds().getX(), graphics2D
    .getClipBounds().getY());
    // VIII
    Rectangle allocation = new Rectangle(0, (int) -pageStartY,
    (int) (jeditorPane.getMinimumSize().getWidth()), (int) (jeditorPane
    .getPreferredSize().getHeight()));
    // X
    if (printView(graphics2D, allocation, rootView)) {
    return Printable.PAGE_EXISTS;
    } else {
    pageStartY = 0;
    pageEndY = 0;
    currentPage = -1;
    return Printable.NO_SUCH_PAGE;
    }
    }

/*

  • print(HTMLDocument) is called to set an HTMLDocument for printing.
    */
    public void print(HTMLDocument htmlDocument) {
    setDocument(htmlDocument);
    printDialog();
    }

/*

  • print(JEditorPane) prints a Document contained within a JEDitorPane.
    */
    public void print(JEditorPane jedPane) {
    setDocument(jedPane);
    printDialog();
    }

/*

  • print(PlainDocument) is called to set a PlainDocument for printing.
    */
    public void print(PlainDocument plainDocument) {
    setDocument(plainDocument);
    printDialog();
    }

/*

  • A protected method, printDialog(), displays the print dialog and
  • initiates printing in response to user input.
    /
    protected void printDialog() {
    boolean silent = true;
    if (silent ? true : pJob.printDialog()) {
    pJob.setPrintable(this, pFormat);
    try {
    pJob.print();
    } catch (PrinterException printerException) {
    pageStartY = 0;
    pageEndY = 0;
    currentPage = -1;
    System.out.println(“Error Printing Document”);
    }
    }
    /
    • if (pJob.printDialog()) { pJob.setPrintable(this, pFormat);
    • try { pJob.print(); } catch (PrinterException printerException) {
    • pageStartY = 0; pageEndY = 0; currentPage = -1;
    • System.out.println(“Error Printing Document”); } }
      */}

/*

  • printView is a recursive method which iterates through the tree structure
  • of the view sent to it. If the view sent to printView is a branch view,
  • that is one with children, the method calls itself on each of these
  • children. If the view is a leaf view, that is a view without children
  • which represents an actual piece of text to be painted, printView
  • attempts to render the view to the Graphics2D object.
  • I. When any view starts after the beginning of the current printable
  • page, this means that there are pages to print and the method sets
  • pageExists to true. II. When a leaf view is taller than the printable
  • area of a page, it cannot, of course, be broken down to fit a single
  • page. Such a View will be printed whenever it intersects with the
  • Graphics2D clip. III. If a leaf view intersects the printable area of the
  • graphics clip and fits vertically within the printable area, it will be
  • rendered. IV. If a leaf view does not exceed the printable area of a page
  • but does not fit vertically within the Graphics2D clip of the current
  • page, the method records that this page should end at the start of the
  • view. This information is stored in pageEndY.
    */
    protected boolean printView(Graphics2D graphics2D, Shape allocation, View view) {
    boolean pageExists = false;
    Rectangle clipRectangle = graphics2D.getClipBounds();
    Shape childAllocation;
    View childView;
    if (view.getViewCount() > 0
    && !view.getElement().getName().equalsIgnoreCase(“td”)) {
    for (int i = 0; i < view.getViewCount(); i++) {
    childAllocation = view.getChildAllocation(i, allocation);
    if (childAllocation != null) {
    childView = view.getView(i);
    if (printView(graphics2D, childAllocation, childView)) {
    pageExists = true;
    }
    }
    }
    } else {
    // I
    if (allocation.getBounds().getMaxY() >= clipRectangle.getY()) {
    pageExists = true;
    // II
    if ((allocation.getBounds().getHeight() > clipRectangle.getHeight())
    && (allocation.intersects(clipRectangle))) {
    view.paint(graphics2D, allocation);
    } else {
    // III
    if (allocation.getBounds().getY() >= clipRectangle.getY()) {
    if (allocation.getBounds().getMaxY() <= clipRectangle.getMaxY()) {
    view.paint(graphics2D, allocation);
    } else {
    // IV
    if (allocation.getBounds().getY() < pageEndY) {
    pageEndY = allocation.getBounds().getY();
    }
    }
    }
    }
    }
    }
    return pageExists;
    }

/*

  • Method to set the content type the JEditorPane.
    */
    protected void setContentType(String type) {
    jeditorPane.setContentType(type);
    }

/*

  • Method to set an HTMLDocument as the Document to print.
    */
    public void setDocument(HTMLDocument htmlDocument) {
    jeditorPane = new JEditorPane();
    setDocument(“text/html”, htmlDocument);
    }

/*

  • Method to set the Document to print as the one contained in a
  • JEditorPane. This method is useful when Java does not provide direct
  • access to a particular Document type, such as a Rich Text Format
  • document. With this method such a document can be sent to the
  • DocumentRenderer class enclosed in a JEditorPane.
    */
    public void setDocument(JEditorPane jedPane) {
    jeditorPane = new JEditorPane();
    setDocument(jedPane.getContentType(), jedPane.getDocument());
    }

/*

  • Method to set a PlainDocument as the Document to print.
    */
    public void setDocument(PlainDocument plainDocument) {
    jeditorPane = new JEditorPane();
    setDocument(“text/plain”, plainDocument);
    }

/*

  • Method to set the content type and document of the JEditorPane.
    */
    protected void setDocument(String type, Document document) {
    setContentType(type);
    jeditorPane.setDocument(document);
    }

/*

  • Method to set the current choice of the width scaling option.
    */
    public void setScaleWidthToFit(boolean scaleWidth) {
    scaleWidthToFit = scaleWidth;
    }
    }
    [/color]

e o html que o chama:

[color=darkblue]

Documento sem título [/color]

comandos que usei para assinar

keytool -genkey -alias impressao -keyalg rsa

jarsigner impressao.jar impressao

keytool -export -keystore “c:\Documents and Settings\t311078.keystore” -alias impressao -file keycert.x509

O erro:
[color=red]
java.security.PrivilegedActionException: java.lang.reflect.InvocationTargetException
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.JSInvoke.invoke(Unknown Source)
at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
at sun.plugin.liveconnect.PrivilegedCallMethodAction.run(Unknown Source)
… 4 more
Caused by: java.lang.RuntimeException: java.security.AccessControlException: access denied (java.net.SocketPermission www.yahoo.com.br:80 connect,resolve)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getHeaderField(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at javax.swing.JEditorPane.getStream(Unknown Source)
at javax.swing.JEditorPane.setPage(Unknown Source)
at javax.swing.JEditorPane.setPage(Unknown Source)
at javax.swing.JEditorPane.(Unknown Source)
at Impressao.imprimePagina(Impressao.java:13)
… 14 more
Caused by: java.security.AccessControlException: access denied (java.net.SocketPermission www.yahoo.com.br:80 connect,resolve)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
… 20 more
[/color]