2D printing will print images at hi-res, and FX printing will too .. I remember testing
with some ultra hi-res images I found somewhere.

To get a hi-res image printed out you would need to be able to capture all of the device pixels - if they aren't there to start with there's nothing printing can do. If you do that I believe it 'just works'. I used an image at full resolution and
placed it into an ImageView which had the size I wanted.

If it was scaled down to 144x144 screen /user pixels, it'll get scaled down to 2"x2" on the printer. If the image was really 1,440x1,440 all those pixels will be sent to the printer and the results
should look good.

The snippet below probably isn't working with a hi-res image, instead just scaling the
up the image to fit the page. It may be scaling by < 2 for all I can tell.
The PrintResolution attribute needs to be involved somewhere if you want to know how much to scale the backbuffer from which you get the pixels but 300dpi should
look ok except to a discerning user.

I am however not sure how "the AWT printing mechanism" can be coerced into
converting a node to a WriteableImage. I just don't follow that sentence.

-phil.

On 11/11/2014 11:12 AM, Scott Palmer wrote:
I'm curious. If printing in JavaFX is implemented via Java2D then why isn't it matching what "worked" for the OP?

"I have tried using the AWT printing mechanism to convert the node to a
WritableImage and then to a BufferedImage for printing. This works in that
it prints but we aren't happy with the quality that we get from it."

Presumably with the appropriate transform in the SnapshotParameters the image resolution can be made to match the printer. If memory is a concern, it could be done in strips by manipulating the SnapshotParameters viewport.
Perhaps I am missing some threading issue that makes this impossible?


Scott

On Tue, Nov 11, 2014 at 1:13 PM, Phil Race <[email protected] <mailto:[email protected]>> wrote:

    This is analagous to the software pipeline where 3D rendering -
    even to screen  - is not supported.

    I can't see that we documented it, but we were aware that printing
    3D was out-of-scope for FX 8.
    FWIW I think these features were overlapping in development and
    printing was largely done
    before 3D was complete.

    If you are running an accelerated (D3D or OpenGL) pipeline and the
    Node.snapshot(..) function can grab
    the 3d node  perhaps we could implement printing the scene in
    terms of that.
    So what you get would be whatever snapshot would do for you.  In
    the interim you could do that yourself.

    -phil.



    On 11/11/2014 7:29 AM, Kevin Rushforth wrote:

        3D is not supported for printing. I don't know whether this is
        documented (it should be if it isn't), but it is a known
        limitation of the current implementation which uses Java2D to
        render.

        -- Kevin


        Scott Palmer wrote:

            I suggest you file a bug with a reproducible test case at
            https://javafx-jira.kenai.com/
            If the 3D node will render to an image, then it should
            also be printable
            directly.

            Scott

            On Mon, Nov 10, 2014 at 8:16 PM, Cheryl Long
            <[email protected] <mailto:[email protected]>> wrote:

                I posted the following question on Stack Overflow and
                it was suggested that
                I ask it here.

                I am trying to use the JavaFX 8 printing API and I am
                running into problems
                when I try to print any scene/node that contains any
                sort of 3D content. I
                have been searching both here and other sites for an
                answer and haven't
                been able to find anything to help.

                If the node contains only 2D content, the scene will
                print on my selected
                printer without issue. But if I add a single 3D object
                to the scene, the
                whole thing fails to print - without any error but
                without any content. If
                I am printing to a printer, a blank page is "printed"
                and if I am printing
                to a document printer, I get an empty document.

                I have tried using the AWT printing mechanism to
                convert the node to a
                WritableImage and then to a BufferedImage for
                printing. This works in that
                it prints but we aren't happy with the quality that we
                get from it.

                My print caller is fairly standard at this stage -

                private void doPrintFX() {
                    Printer printer = Printer.getDefaultPrinter();
                    PageLayout pageLayout = printer.createPageLayout(
                            Paper.A3, PageOrientation.LANDSCAPE,
                Printer.MarginType.DEFAULT);

                    final double scaleFactor =
                computeScaleFactor(pageLayout.getPrintableWidth(),
                            pageLayout.getPrintableHeight(),
                            sceneNode.getBoundsInParent().getWidth(),
                            sceneNode.getBoundsInParent().getHeight());
                    if (scaleFactor != 0) {
                        sceneNode.getTransforms().add(new
                Scale(scaleFactor, scaleFactor));
                    }

                    PrinterJob job = PrinterJob.createPrinterJob(printer);
                    if (job != null) {
                        System.out.println("Printing to " +
                job.getPrinter().getName());
                        boolean success = job.printPage(pageLayout,
                sceneNode);
                        if (success) {
                            job.endJob();
                        }
                    }}

                I have scaled back the node to be a very simple scene
                containing a couple
                of rectangles and a cylinder. The code I am currently
                using is:

                    Cylinder cylinder = new Cylinder(50, 150);
                    cylinder.setLayoutX(250);
                    cylinder.setLayoutY(100);
                    canvas.getDrawingPane().getChildren().add(cylinder);

                    Rectangle item = new Rectangle(50, 50, 100, 50);
                    item.setStroke(Color.BLACK);
                    item.setFill(null);
                    canvas.getDrawingPane().getChildren().add(item);

                    item = new Rectangle(75, 75, 100, 50);
                    item.setStroke(Color.BLACK);
                    item.setFill(null);
                    canvas.getDrawingPane().getChildren().add(item);

                The canvas.getDrawingPane is a Pane and is what is
                being sent to the print
                function.

                Can anyone advise what might be wrong with what I am
                doing? Does the JavaFX
                print API support printing of 3D nodes?

                Thank you.




Reply via email to