Announcement

Collapse
No announcement yet.

PDF kann nicht geöffnet werden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PDF kann nicht geöffnet werden

    Hallo!

    Ich hoffe jemand von euch hat einen Tipp für mich! Wenn ich mein PDF über

    fop -xml test.xml -xsl test.xsl -pdf test.pdf

    erstellen lasse, funktioniert alles einwandfrei und ich kann das pdf öffnen. Dann habe ich ein java-programm geschrieben, wo ich das gleiche ausführe- funktioniert einwandfrei. Dann habe ich den Quellcode genommen und in mein Servlet kopiert. und wenn ich die gleiche Datei hierfür nehme und das gleiche xsl und ausführe und das pdf öffnen möchte, kommt die Fehlermeldung, dass ich das pdf nicht öffnen kann und zwar "Beim Öffnen dieses Dokuments ist ein Fehler aufgetreten. Die Datei ist beschädigt und kann nicht repariert werden".

    Hat jemand eine Idee woran das liegen könnte?

    Viele Grüße
    Katse

  • #2
    Hi,

    du kannst dir ja mal die Größe, der erstellten Datei angucken. Vielleicht ist sie ja quasi leer. Damit kannst du den Fehler unter Umständen einkreisen.
    "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

    Viele Grüße Novi

    Comment


    • #3
      Am Quellcode, am Speicherort der Datei(en)

      Des Weiteren ist das

      fop -xml test.xml -xsl test.xsl -pdf test.pdf

      kein Javacode...
      Zuletzt editiert von Christian Marquardt; 31.10.2009, 11:45.
      Christian

      Comment


      • #4
        Also normalerweise wäre das erstellte pdf 9kb, aber mein erstelltes ist nur 1kb, also bricht er wohl dann einfach ab.

        Habe mal etwas getestet, denn bei mir gibt er in der Konsole immer Warnungen aus, was ihn aber bei Erstellung über Konsole oder Java-Programm nicht stört. in einer Datei hatte ich keine Tabellen und da hatte er nur wg Schrift Arial (die findet er nämlich nicht) gemeckert. Habe also das font-family mal rausgelöscht und diese Datei konnte ich jetzt öffnen. Also muss es ja eigentlich dran liegen, dass er die Datei nicht fertigschreibt, wenn er Warnungen hat, aber nur wenn man es in einer Servlet-Umgebung laufen lässt *ärger*

        Ich weiß leider nicht, wie ich die Warnungen entfernen könnte. Er meckert bei mir, weil ich layout-auto (also keine festen Breiten angegeben habe) verwende und er meint, er würde das nicht unterstützen, aber ich wollte ungern feste Breiten angeben, weil es ja manchmal 3 und manchmal 6 Spalten sind und ab und zu auch mal eine Warnung wg overflow, weil das Wort einfach zu lang ist und zB in Anführungsstriche steht, dann trennt er das wohl nicht, obwohl ich bei jedem fo:table-cell overflow="hidden" eingestellt habe. Ich weiß nicht, wie ich die Warnungen wegbekommen könnte.

        Könnt ihr mir helfen? Oder habt einen Tipp für mich?

        Viele Grüße
        Katse

        Comment


        • #5
          wenn er Warnungen hat, aber nur wenn man es in einer Servlet-Umgebung laufen lässt *ärger*
          Was sagen die Logfiles des Applicationserver?
          Werden Exceptions geworfen?
          Was machst du mit Exceptions? Fangen oder weiterreichen?

          Wie gesagt ist

          fop -xml test.xml -xsl test.xsl -pdf test.pdf

          kein Java
          Christian

          Comment


          • #6
            Was sagen die Logfiles des Applicationserver?
            Da stehen keine Fehler drinnen
            Werden Exceptions geworfen?
            Was machst du mit Exceptions? Fangen oder weiterreichen?
            Exceptions fange ich im Servlet ab mit

            Code:
            }catch (FileNotFoundException fne) {
                      optionPane.showMessageDialog(null, "File not Found: " + fne.toString(), "Fehler", optionPane.ERROR_MESSAGE);
                    }catch (IOException ioe) {
                      optionPane.showMessageDialog(null, "IO Exception: " + ioe.toString(), "Fehler", optionPane.ERROR_MESSAGE);
                    }catch (TransformerException te) {
                      optionPane.showMessageDialog(null, "Transformer: " + te.toString(), "Fehler", optionPane.ERROR_MESSAGE);
                    }catch (FOPException fope) {
                      optionPane.showMessageDialog(null, "FOP Exception: " + fope.toString(), "Fehler", optionPane.ERROR_MESSAGE);
                    }
            Wie gesagt ist

            fop -xml test.xml -xsl test.xsl -pdf test.pdf

            kein Java
            Ja das ist klar ;-) das habe ich ja nur unter der Konsole verwendet. Ich kann auch gerne meinen Java-Code posten, aber ich denke nicht, dass es am Java-Code an sich liegt, denn unter Java läuft es ja auch, nur in meinem Servlet nicht und da nehme ich mein normales Servlet und kopiere den Teil zur Konvertierung von xml nach pdf dort in eine Schleife (wo er eben mit der Konvertierung beginnen soll) rein, also dürfe es ja kein Java-Problem sein oder? ich denke dass er die Warnungen wohin schreiben will, aber nichts hat (weil man da nichts angegeben hat, das hat er bei Java einfach automatisch in die Systemausgabe reingeschrieben) und deswegen beim Servlet ein Problem hat. genau wissen tu ich es nicht, daher hatte ich die Hoffnung, dass man vielleicht beim Kompilieren oder eben im Servlet etwas eingeben könnte, das die Warnungen ignoriert werden

            Ich bin echt ratlos

            Comment


            • #7
              Wenn du das fop -xml test.xml -xsl test.xsl -pdf test.pdf im Servlet machst wird das wohl nichts

              Code:
               
              private FopFactory fopFactory = FopFactory.newInstance();
              private TransformerFactory tFactory = TransformerFactory.newInstance();
               
              public void doGet(HttpServletRequest request,
                                 HttpServletResponse response) throws ServletException {
                  try {
                      response.setContentType("application/pdf");
                      Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, response.getOutputStream());
                      Transformer transformer = tFactory.newTransformer();
                      Source src = new StreamSource("foo.fo");
                      Result res = new SAXResult(fop.getDefaultHandler());
                      transformer.transform(src, res);
                  } catch (Exception ex) {
                      throw new ServletException(ex);
                  }
              }
              http://xmlgraphics.apache.org/fop/0.95/servlets.html

              EDIT

              Wie kann eine Webanwendung

              optionPane.showMessageDialog(null, "FOP Exception: " + fope.toString(), "Fehler", optionPane.ERROR_MESSAGE);

              benutzen???
              Zuletzt editiert von Christian Marquardt; 31.10.2009, 12:40.
              Christian

              Comment


              • #8
                Da hast du mich falsch verstanden - ich verwende das nicht im Servlet, sondern habe es folgendermaßen umgesetzt:

                Code:
                public void doGet (HttpServletRequest request,
                    HttpServletResponse response)
                    throws ServletException, IOException
                    {
                  try{
                          response.setContentType("application/pdf");
                          FopFactory fopFactory = FopFactory.newInstance();
                          OutputStream outPDF = new BufferedOutputStream(new FileOutputStream(new File("test.pdf")));
                          try {
                            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, outPDF);
                            TransformerFactory factory = TransformerFactory.newInstance();
                            Transformer transformer = factory.newTransformer(new StreamSource("test.xsl"));
                            Source src = new StreamSource(new File(strXMLPath));
                
                            Result res = new SAXResult(fop.getDefaultHandler());
                
                            transformer.transform(src, res);
                
                          } finally {
                            //Clean-up
                            outPDF.close();
                          }
                        }catch (FileNotFoundException fne) {
                          optionPane.showMessageDialog(null, "File not Found: " + fne.toString(), "Fehler", optionPane.ERROR_MESSAGE);
                        }catch (IOException ioe) {
                          optionPane.showMessageDialog(null, "IO Exception: " + ioe.toString(), "Fehler", optionPane.ERROR_MESSAGE);
                        }catch (TransformerException te) {
                          optionPane.showMessageDialog(null, "Transformer: " + te.toString(), "Fehler", optionPane.ERROR_MESSAGE);
                        }catch (FOPException fope) {
                          optionPane.showMessageDialog(null, "FOP Exception: " + fope.toString(), "Fehler", optionPane.ERROR_MESSAGE);
                        }
                }
                Also fast genauso wie du es geschrieben hast, nur dass ich für das pdf einen Pfad angegeben habe oder?

                Wenn man oben im Servlet:
                import javax.swing.*;
                einbindet und dann die Variable
                JOptionPane optionPane = new JOptionPane();
                deklariert, kann man optionPane im Servlet ausführen funktioniert schon - nur manchmal (nicht immer) wird es hinter dem Fenster angezeigt, das ist nicht so perfekt, aber doch ganz gut für Fehlerausgaben
                Zuletzt editiert von Katse; 31.10.2009, 12:54. Reason: Geschweifte Klammer vergessen

                Comment


                • #9
                  Ich weiß jetzt nicht wieso das vorhin nicht in der error.log stand aber wird beim Ausführen der Konvertierung folgendes in die error.log geschrieben: das einzige was ich geändert hatte, war dass ich "response.setContentType("application/pdf");" aufgenommen habe.

                  Ausgaben aus der error.log herauskopiert:
                  [Error] test.xml:1:325: Element type "dmodule" must be declared.
                  [Error] test.xml:1:335: Element type "idstatus" must be declared.
                  [Error] test.xml:1:345: Element type "dmaddres" must be declared.
                  [Error] test.xml:1:350: Element type "dmc" must be declared.
                  [Error] test.xml:1:356: Element type "avee" must be declared.
                  [Error] test.xml:1:365: Element type "modelic" must be declared.
                  [Error] test.xml:1:382: Element type "sdc" must be declared.
                  [Error] test.xml:1:398: Element type "chapnum" must be declared.
                  [Error] test.xml:1:419: Element type "section" must be declared.
                  [Error] test.xml:1:439: Element type "subsect" must be declared.
                  [Error] test.xml:1:459: Element type "subject" must be declared.
                  [Error] test.xml:1:480: Element type "discode" must be declared.
                  [Error] test.xml:1:502: Element type "discodev" must be declared.
                  [Error] test.xml:1:522: Element type "incode" must be declared.
                  [Error] test.xml:1:543: Element type "incodev" must be declared.
                  [Error] test.xml:1:563: Element type "itemloc" must be declared.
                  [Error] test.xml:1:596: Element type "dmtitle" must be declared.
                  [Error] test.xml:1:606: Element type "techname" must be declared.
                  [Error] test.xml:1:658: Element type "infoname" must be declared.
                  [Error] test.xml:1:725: Element type "issno" must be declared.
                  [Error] test.xml:1:767: Element type "issdate" must be declared.
                  [Error] test.xml:1:805: Element type "language" must be declared.
                  [Error] test.xml:1:824: Element type "status" must be declared.
                  [Error] test.xml:1:845: Element type "security" must be declared.
                  [Error] test.xml:1:866: Element type "rpc" must be declared.
                  [Error] test.xml:1:895: Element type "orig" must be declared.
                  [Error] test.xml:1:910: Element type "applic" must be declared.
                  [Error] test.xml:1:916: Element type "type" must be declared.
                  [Error] test.xml:1:955: Element type "model" must be declared.
                  [Error] test.xml:1:986: Element type "version" must be declared.
                  [Error] test.xml:1:1017: Element type "qa" must be declared.
                  [Error] test.xml:1:1042: Element type "firstver" must be declared.
                  [Error] test.xml:1:1065: Element type "secver" must be declared.
                  [Error] test.xml:1:1088: Element type "skill" must be declared.
                  [Error] test.xml:1:1097: Element type "remarks" must be declared.
                  [Error] test.xml:1:1220: Element type "content" must be declared.
                  [Error] test.xml:1:1226: Element type "refs" must be declared.
                  [Error] test.xml:1:1235: Element type "norefs" must be declared.
                  [Error] test.xml:1:1250: Element type "proced" must be declared.
                  [Error] test.xml:1:1260: Element type "prelreqs" must be declared.
                  [Error] test.xml:1:1270: Element type "reqconds" must be declared.
                  [Error] test.xml:1:1280: Element type "noconds" must be declared.
                  [Error] test.xml:1:1300: Element type "reqpers" must be declared.
                  [Error] test.xml:1:1311: Element type "asrequir" must be declared.
                  [Error] test.xml:1:1334: Element type "perscat" must be declared.
                  [Error] test.xml:1:1355: Element type "perskill" must be declared.
                  [Error] test.xml:1:1364: Element type "esttime" must be declared.
                  [Error] test.xml:1:1395: Element type "supequip" must be declared.
                  [Error] test.xml:1:1404: Element type "supeqli" must be declared.
                  [Error] test.xml:1:1413: Element type "supequi" must be declared.
                  [Error] test.xml:1:1420: Element type "nomen" must be declared.
                  [Error] test.xml:1:1528: Element type "nsn" must be declared.
                  [Error] test.xml:1:1537: Element type "identno" must be declared.
                  [Error] test.xml:1:1542: Element type "pnr" must be declared.
                  [Error] test.xml:1:1564: Element type "mfc" must be declared.
                  [Error] test.xml:1:1605: Element type "qty" must be declared.
                  [Error] test.xml:1:1653: Element type "supplies" must be declared.
                  [Error] test.xml:1:1664: Element type "nosupply" must be declared.
                  [Error] test.xml:1:1683: Element type "spares" must be declared.
                  [Error] test.xml:1:1694: Element type "nospares" must be declared.
                  [Error] test.xml:1:1711: Element type "safety" must be declared.
                  [Error] test.xml:1:1722: Element type "nosafety" must be declared.
                  [Error] test.xml:1:1752: Element type "mainfunc" must be declared.
                  [Error] test.xml:1:1759: Element type "step1" must be declared.
                  [Error] test.xml:1:1765: Element type "para" must be declared.
                  [Error] test.xml:1:1853: Element type "xref" must be declared.
                  [Error] test.xml:1:1991: Element type "xref" must be declared.
                  [Error] test.xml:1:2151: Element type "figure" must be declared.
                  [Error] test.xml:1:2158: Element type "title" must be declared.
                  [Error] test.xml:1:2249: Element type "graphic" must be declared.
                  [Error] test.xml:1:2401: Element type "hotspot" must be declared.
                  [Error] test.xml:1:2556: Element type "hotspot" must be declared.
                  [Error] test.xml:1:2605: Element type "closeup" must be declared.
                  [Error] test.xml:1:2615: Element type "noclose" must be declared.
                  java.lang.NoSuchMethodError: java.util.logging.Logger.logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/StringV
                  at org.apache.commons.logging.impl.Jdk14Logger.log(Jd k14Logger.java:91)
                  at org.apache.commons.logging.impl.Jdk14Logger.warn(J dk14Logger.java:242)
                  at org.apache.fop.fo.FONode.attributeWarning(FONode.j ava:340)
                  at org.apache.fop.fo.flow.Table.bind(Table.java:138)
                  at org.apache.fop.fo.FObj.processNode(FObj.java:125)
                  at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.star tElement(FOTreeBuilder.java:320)
                  at org.apache.fop.fo.FOTreeBuilder.startElement(FOTre eBuilder.java:185)
                  at org.apache.xalan.transformer.QueuedStartElement.fl ush(QueuedStartElement.java:357)
                  at org.apache.xalan.transformer.ResultTreeHandler.flu shPending(ResultTreeHandler.java:770)
                  at org.apache.xalan.transformer.ResultTreeHandler.end Element(ResultTreeHandler.java:279)
                  at org.apache.xalan.templates.ElemLiteralResult.execu te(ElemLiteralResult.java:749)
                  at org.apache.xalan.transformer.TransformerImpl.execu teChildTemplates(TransformerImpl.java:2202)
                  at org.apache.xalan.transformer.TransformerImpl.apply TemplateToNode(TransformerImpl.java:2085)
                  at org.apache.xalan.transformer.TransformerImpl.trans formNode(TransformerImpl.java:1219)
                  at org.apache.xalan.transformer.TransformerImpl.run(T ransformerImpl.java:2942)
                  at java.lang.Thread.run(Thread.java:579)

                  Comment


                  • #10
                    Ich verstehe das nicht mehr:

                    ich verwende das nicht im Servlet, sondern habe es folgendermaßen umgesetzt:
                    Das ist das wie ich das gepostet habe

                    Also fast genauso wie du es geschrieben hast
                    Nun doch?

                    nur dass ich für das pdf einen Pfad angegeben habe oder?
                    Nein, in meinem Beispiel wird das PDF an den Client gesandt; du versuchst es lokal auf dem Server zu speichern. Den response bedienst du nicht, so kommt bei Client nichts an


                    einbindet und dann die Variable
                    JOptionPane optionPane = new JOptionPane();
                    deklariert, kann man optionPane im Servlet ausführen funktioniert schon - nur manchmal (nicht immer) wird es hinter dem Fenster angezeigt, das ist nicht so perfekt, aber doch ganz gut für Fehlerausgaben
                    Das hat in einem Servlet nichts zu suchen. Ausgaben werden geloggt oder mit System.out in die Konsole geschrieben. So ist das katastrophal Swing-Elemente mit einer Webanwendung zu verbinden


                    Sieh dir das Beispiel auf der Website von Apache an
                    Christian

                    Comment


                    • #11
                      Bezüglich deiner Logausgabe

                      java.util.logging.Logger.logp -> ist der Fehler, wo das Servlet aussteigt

                      Ev. hast du den Logger nicht mit eingebunden und die [Error]-Meldungen müssten auch in der Desktopanwendung kommen
                      Christian

                      Comment


                      • #12
                        Ja ich habe mich denke ich etwas missverständlich ausgedrückt, ja genau ich verwende es so wie du es geschrieben hast.

                        aber was passiert dann beim Client? Man muss doch einen Speicherort angeben oder?

                        Zitat:
                        nur dass ich für das pdf einen Pfad angegeben habe oder?
                        Nein, in meinem Beispiel wird das PDF an den Client gesandt; du versuchst es lokal auf dem Server zu speichern. Den response bedienst du nicht, so kommt bei Client nichts an


                        Das hat in einem Servlet nichts zu suchen. Ausgaben werden geloggt oder mit System.out in die Konsole geschrieben. So ist das katastrophal Swing-Elemente mit einer Webanwendung zu verbinden
                        Du meinst wenn ich System.out verwende, würde es automatisch in die error.log geschrieben werden? Ich hatte immer das Gefühl, wenn ich System.out verwendet habe, dass er es irgendwo hinschreibt wo ich keinen Zugriff habe. wenn ich hiermit falsch liege, ändere ich es natürlich gerne auf System.out


                        java.util.logging.Logger.logp -> ist der Fehler, wo das Servlet aussteigt

                        Ev. hast du den Logger nicht mit eingebunden und die [Error]-Meldungen müssten auch in der Desktopanwendung kommen
                        Blöde Frage, aber wie muss ich den einbinden In der Desktopanwendung ist mir nichts aufgefallen

                        Comment


                        • #13
                          aber was passiert dann beim Client? Man muss doch einen Speicherort angeben oder?
                          Nein, es wird "on the fly" in den response geschrieben und an den Client gesandt. es wird NICHT auf dem Server gespeichert und von dort "downgeloaded".
                          Christian

                          Comment


                          • #14
                            Ich habe das von der Apache-Homepage
                            Code:
                            private FopFactory fopFactory = FopFactory.newInstance();
                            private TransformerFactory tFactory = TransformerFactory.newInstance();
                            
                            public void init() throws ServletException {
                                //Optionally customize the FopFactory and TransformerFactory here
                            }
                            
                            [..]
                            
                                //Setup a buffer to obtain the content length
                                ByteArrayOutputStream out = new ByteArrayOutputStream();
                            
                                //Setup FOP
                                Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
                            
                                //Setup Transformer
                                Source xsltSrc = new StreamSource(new File("foo-xml2fo.xsl"));
                                Transformer transformer = tFactory.newTransformer(xsltSrc);
                            
                                //Make sure the XSL transformation's result is piped through to FOP
                                Result res = new SAXResult(fop.getDefaultHandler());
                            
                                //Setup input
                                Source src = new StreamSource(new File("foo.xml"));
                            
                                //Start the transformation and rendering process
                                transformer.transform(src, res);
                            
                                //Prepare response
                                response.setContentType("application/pdf");
                                response.setContentLength(out.size());
                                
                                //Send content to Browser
                                response.getOutputStream().write(out.toByteArray());
                                response.getOutputStream().flush();
                            jetzt mal getestet, jetzt habe ich auch verstanden wie du es gemeint hast ;-) die eine Datei, die ohne Warnungen kompiliert werden kann, funktioniert wieder und die andere Datei, die leider wg der Tabelle (table-layout auto (weil nichts angegeben) und wg overflows) Warnungen (in der Konsole normalerweise) erzeugen würde, da kommt wieder die gleiche Fehlermeldung, wenn er das pdf anzeigen möchte das mit diesem Logger verstehe ich nicht, habe mal import java.util.logging.Logger; eingebunden, aber das hat nicht geholfen

                            Comment


                            • #15
                              Der Logger, der Von FOP genutzt wird liegt doch in dem Lib-Verzeichnis des Downloads. Alle diese Libs müssen dem Applicationserver bekannt gemacht werden-> durch deploy der Libs mit der Anwendung
                              Christian

                              Comment

                              Working...
                              X