De cómo se podría ir sobre la conversión de un archivo pdf a un archivo PDF a través de programación? (Tengo que modificar el archivo SVG en ciertos aspectos antes de generar el PDF, así que simplemente pre-conversión de uso de una herramienta no ser suficiente).

Idealmente utilizando Java pero en Perl o PHP estaría bien también.

Obviamente estoy básicamente considerando Apache FOP y de Batik de Java. Sin embargo, no importa el tiempo que busco no puedo encontrar una simple introducción sobre cómo hacerlo. Cosas como SVGConverter tienen descripciones como «Define la interfaz para las clases que son capaces de convertir la totalidad o parte de una GraphicContext», pero realmente no sé lo que eso significa.

Tengo este sentimiento no debe ser una API para hacer esto, simplemente, proporcionada por FOP o Batik, pero no soy capaz de encontrarlo en el momento (o tal vez lo que realmente no existe.)

En términos de la SVG compatibles funciones que necesito, el archivo tiene algunos de los caminos que están llenos de algunos gradientes lineales.

Idealmente si me podrian pasar el SVG en un Documento DOM que sería lo ideal; luego me iba a cargar la plantilla de archivo SVG, el cambio según lo especificado por el usuario y, a continuación, generar el PDF.

InformationsquelleAutor Adrian Smith | 2011-07-29

5 Comentarios

  1. 18

    Gracias a Adrian para mostrar cómo el Batik trama API se supone que se utiliza. Sin embargo, necesitaba una más ligera solución— yo no puedo escribir en archivos temporales, y quiero menos dependencias. Así que, a partir de los métodos que él señaló, he encontrado una manera de acceder a la parte inferior de nivel de código para hacer la conversión y nada más.

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    
    import org.apache.batik.transcoder.Transcoder;
    import org.apache.batik.transcoder.TranscoderException;
    import org.apache.batik.transcoder.TranscoderInput;
    import org.apache.batik.transcoder.TranscoderOutput;
    import org.apache.fop.svg.PDFTranscoder;
    
    public class Test {
        public static void main(String[] argv) throws TranscoderException, FileNotFoundException {
            Transcoder transcoder = new PDFTranscoder();
            TranscoderInput transcoderInput = new TranscoderInput(new FileInputStream(new File("/tmp/test.svg")));
            TranscoderOutput transcoderOutput = new TranscoderOutput(new FileOutputStream(new File("/tmp/test.pdf")));
            transcoder.transcode(transcoderInput, transcoderOutput);
        }
    }

    El compilar y ejecutar comandos son

    javac -cp batik-rasterizer.jar -d build Test.java
    java -cp build:batik-rasterizer.jar Test

    El punto importante es que TranscoderInput y TranscoderOutput puede trabajar con cualquier InputStream y OutputStream, no sólo secuencias de archivo. Tenga en cuenta que uno de los constructores toma un org.w3c.dom.Documento, lo que significa que usted ni siquiera necesita para serializar un SVG DOM en un SVG cadena, ahorrando un paso adicional.

    Esta versión también no escribir nada a stdout/stderr, a diferencia de la API de alto nivel.

    Para el formato JPEG, PNG o TIFF de salida, reemplazar org.apache.fop.svg.PDFTranscoder con org.apache.batik.transcoder.image.JPEGTranscoder, PNGTranscoder, o TIFFTranscoder (tenga en cuenta que estos formatos de mapa de bits están en un paquete diferente).

    (No estoy muy seguro de cómo Java se encuentra el org.apache.batk.transcoder.* y org.apache.fop.svg.PDFTranscoder clases, ya que no veo en el batik-rasterizer.jar.)

    Edición:

    Aunque la simple línea de comandos de compilación de obras con el batik-rasterizer.jar sólo, es hacer algún tipo de cargador de clases de magia para encontrar todas las clases necesarias. En un caso más realista (la construcción de un proyecto con Ant), usted tiene que encontrar las clases con la mano. Ellos pueden ser encontrados en batik-1.7.zip de el Batik proyecto y fop-1.1.zip de la FOP proyecto. De Batik, se necesita compilar con batik-transcoder.jar y ejecutar con

    • batik-transcoder.jar
    • batik-anim.jar
    • batik-awt-util.jar
    • batik-bridge.jar
    • batik-css.jar
    • batik-dom.jar
    • batik-ext.jar
    • batik-gvt.jar
    • batik-parser.jar
    • batik-script.jar
    • batik-svg-dom.jar
    • batik-util.jar
    • batik-xml.jar
    • xml-apis-ext.jar

    De FOP, se necesita compilar con fop.jar y ejecutar con

    • fop.jar
    • avalon-framework-4.2.0.jar
    • xmlgraphics-commons-1.5.jar
  2. 5

    Finalmente me las arreglé para encontrar el adecuado a las líneas de código para resolver esto mediante la Batik.

    Usted necesita tener el archivo SVG y PDF resultante como archivos en el disco, es decir, no podía encontrar una manera de hacerlo en la memoria (estoy escribiendo un Servlet HTTP así que no tengo ninguna necesidad intrínseca a escribir nada como un archivo, lo ideal sería transmitir el resultado para el cliente HTTP). He utilizado Archivo.createTemporaryFile para crear un archivo de volcado de mi SVG a un archivo, y para el PDF resultante para ser escritos.

    De modo que las líneas que se utilizan son los siguientes:

    import org.apache.batik.apps.rasterizer.DestinationType;
    import org.apache.batik.apps.rasterizer.SVGConverter;
    import ...
    
    //SVG available as a DOM object (created programatically by my program)
    Document svgXmlDoc = ...
    
    //Save this SVG into a file (required by SVG -> PDF transformation process)
    File svgFile = File.createTempFile("graphic-", ".svg");
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    DOMSource source2 = new DOMSource(svgXmlDoc);
    FileOutputStream fOut = new FileOutputStream(svgFile);
    try { transformer.transform(source2, new StreamResult(fOut)); }
    finally { fOut.close(); }
    
    //Convert the SVG into PDF
    File outputFile = File.createTempFile("result-", ".pdf");
    SVGConverter converter = new SVGConverter();
    converter.setDestinationType(DestinationType.PDF);
    converter.setSources(new String[] { svgFile.toString() });
    converter.setDst(outputFile);
    converter.execute();

    Y tengo el siguiente Frascos (búsqueda usando Google para encontrar los proyectos y descargarlos):

    • avalon-framework-4.2.0.jar
    • batik-all-1.7.jar
    • commons-io-1.3.1.jar
    • commons-logging-1.0.4.jar
    • fop-0.95.jar
    • log4j-1.2.15.jar
    • xml-apis-ext.jar
    • xmlgraphics-commons-1.3.1.jar
    • Gracias por esto! Protector de la vida
  3. 4

    necesitará un libray para la representación svg y pdf.
    Recomiendo SVG salamandra para el primero, y iText para el segundo. Con svg salamandra puede leer el svg y crear un objeto de la imagen, y con itext puede escribir la imagen en un pdf.

  4. 1

    Yo uso Altsoft Xml2PDF. Si he entendido correctamente todas sus necesidades y requerimientos, es mejor probar su versión de Servidor de Xml2PDF.

    • Gracias por la sugerencia! Por desgracia yo soy de la implementación en Linux y esta solución parece ser sólo para Windows.
  5. 1

    Todo lo que necesita es phantomjs. Usted no necesita el voluminoso Batik para esto en absoluto; sólo llega a un punto donde puede ejecutar phantomjs, llamando rasterize.js, el uso de la dirección url del pdf como una fuente, y un lugar como el de salida. Dependiendo de lo que quieras hacer con el .pdf, usted incluso no necesita Java.

    http://phantomjs.org/screen-capture.html

    Vistazo a la parte que comienza con «al Lado de formato PNG, PhantomJS admite los formatos JPEG, GIF y PDF.»

    • Esto es bastante creativo, pero en general, esto probablemente no es la mejor ruta. Dependiendo del caso de uso, es probable que usted desee conservar los vectores de SVG en lugar de rasterizar el documento.

Dejar respuesta

Please enter your comment!
Please enter your name here