PDFを編集してストリーム中にzip内に配置し、ITextとJavaを使用してダウンロードするにはどうすればよいですか?

jsPlayer

私の使用例は次のとおりです。クライアントがPDFのダウンロードをクリックしたときに、Itext pdfエディターを使用してPDFにテキストを編集/書き込みし、PDFを圧縮してダウンロードさせます。すべてストリーム中に実行します。PDFが大きい場合など、20〜50kb程度なので問題にならないメモリの問題を認識しています。バイト配列を使用してダウンロードする前にストリーム中にzipを実行しました。次に、zipする前にpdfeditorメソッドも実行し、テキストを追加してダウンロードを実行する必要があります。

これまでの私のコードは次のとおりです。

    public class zipfolder {

        public static void main(String[] args) {
            try {
                System.out.println("opening connection");
                URL url = new URL("http://gitlab.itextsupport.com/itext/sandbox/raw/master/resources/pdfs/form.pdf");
                InputStream in = url.openStream();
                // FileOutputStream fos = new FileOutputStream(new
                // File("enwiki.png"));
                PdfEditor writepdf = new PdfEditor();

                writepdf.manipulatePdf(url, dest, "field"); /// where i belive i
                                                            /// should execute the
                                                            /// editor function ?

                File f = new File("test.zip");

                ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(f));
                ZipEntry entry = new ZipEntry("newform.pdf");
                zos.putNextEntry(entry);

                System.out.println("reading from resource and writing to file...");
                int length = -1;
                byte[] buffer = new byte[1024];// buffer for portion of data from
                                                // connection
                while ((length = in.read(buffer)) > -1) {
                    zos.write(buffer, 0, length);
                }
                zos.close();
                in.close();
                System.out.println("File downloaded");
            } catch (Exception e) {
                System.out.println("Error");
                e.printStackTrace();
            }

         }
         }

        public class PdfEditor {
            public String insertFields (String field, String value) {
                return field + " " + value;
                // System.out.println("does this work :" + field);
            }

            // public static final String SRC = "src/resources/source.pdf";
            // public static final String DEST = "src/resources/Destination.pdf";
            //
            // public static void main(String[] args) throws DocumentException,
            // IOException {
            // File file = new File(DEST);
            // file.getParentFile().mkdirs();
            // }

            public String manipulatePdf(URL src, String dest, String field) throws Exception {
                System.out.println("test");
                try {
                    PdfReader reader = new PdfReader(src);
                    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
                    AcroFields form = stamper.getAcroFields();
                    Item item = form.getFieldItem("Name");
                    PdfDictionary widget = item.getWidget(0);
                    PdfArray rect = widget.getAsArray(PdfName.RECT);
                    rect.set(2, new PdfNumber(rect.getAsNumber(2).floatValue() + 20f));
                    String value = field;
                    form.setField("Name", value);
                    form.setField("Company", value);
                    stamper.close();
                } catch (Exception e) {
                    System.out.println("Error in manipulate");
                    System.out.println(e.getMessage());
                    throw e;
                }
                return field;
            }
        }
jsPlayer

ByteArrayOutputStreamで遊んで、ようやく動作するようになりました。入力ストリームを「manipulatepdf」に渡し、「bytedata」を返します。

public ByteArrayOutputStream manipulatePdf(InputStream in, String field) throws Exception {

    System.out.println("pdfediter got hit");

    ByteArrayOutputStream bytedata = new ByteArrayOutputStream();
    try {
        PdfReader reader = new PdfReader(in);

        PdfStamper stamper = new PdfStamper(reader, bytedata);
        AcroFields form = stamper.getAcroFields();
        Item item = form.getFieldItem("Name");
        PdfDictionary widget = item.getWidget(0);
        PdfArray rect = widget.getAsArray(PdfName.RECT);
        rect.set(2, new PdfNumber(rect.getAsNumber(2).floatValue() + 20f));
        String value = field;
        form.setField("Name", value);
        form.setField("Company", value);
        stamper.close();
    } catch (Exception e) {
        System.out.println("Error in manipulate");
        System.out.println(e.getMessage());
        throw e;
    }
    return bytedata;
}

public String editandzip (String data, String Link) {
    try {
        System.out.println("opening connection");
        URL url = new URL(Link);
        InputStream in = url.openStream();

        System.out.println("in : "+ url);

        //String data  = "working ok with main";
        PdfEditor writetopdf = new PdfEditor();
        ByteArrayOutputStream bao = writetopdf.manipulatePdf(in, data);
        byte[] ba = bao.toByteArray();

        File f = new File("C:/Users/JayAcer/workspace/test/test.zip");


        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(f));
        ZipEntry entry = new ZipEntry("newform.pdf");
        entry.setSize(ba.length);
        zos.putNextEntry(entry);
        zos.write(ba);


        zos.close();
        in.close();
        System.out.println("File downloaded");
    } catch (Exception e) {
        System.out.println("Error");
        e.printStackTrace();
    }
    return data;

}

}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ