Saya menggunakan BIRT untuk menghasilkan laporan sederhana dengan output PDF. Dokumen ini memiliki beberapa celah (diisi dengan gambar placeholder dengan warna tertentu, yang disisipkan sebagai gambar yang disematkan di BIRT) yang ingin saya ganti dengan gambar yang disediakan pengguna.

BIRT menggunakan iText di bawah sampul, jadi saya memutuskan untuk menggunakan iText juga, dalam versi 5. Dokumennya terlihat seperti ini:

enter image description here

Sekarang, saya telah menulis kode ini untuk mengisi hanya celah pertama:

private void replaceStream(PRStream orig, PdfStream stream) throws IOException {
    orig.clear();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    stream.writeContent(baos);
    orig.setData(baos.toByteArray(), false);
    for (PdfName name : stream.getKeys()) {
        orig.put(name, stream.get(name));
    }
}

private void placeSignature(File source, File target, File signature)
        throws IOException, DocumentException {
    PdfReader reader = new PdfReader(source.getPath());
    PdfObject obj;
    for (int i = 1; i <= reader.getXrefSize(); i++) {
        obj = reader.getPdfObject(i);
        if (obj != null && obj.isStream()) {
            PRStream stream = (PRStream) obj;

            byte[] b;
            try {
                b = PdfReader.getStreamBytes(stream);
            } catch (UnsupportedPdfException e) {
                b = PdfReader.getStreamBytesRaw(stream);
            }
            BufferedImage img = ImageIO.read(new ByteArrayInputStream(b));

            if (img != null) {
                boolean signaturePlaceholder = true;
                for (int x = 0; x < img.getWidth(); x++) {
                    for (int y = 0; y < img.getHeight(); y++) {
                        // Check if image is a placeholder, matches a colour
                        if (img.getRGB(x, y) != -65) {
                            signaturePlaceholder = false;
                        }
                    }
                }
                if (signaturePlaceholder) {
                    Image img2 = Image.getInstance(signature.getPath());
                    PdfImage newImg = new PdfImage(img2, "", null);
                    replaceStream(stream, newImg);
                    System.out.println("Replaced!");
                    break;
                }
            }
        }
    }
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(target));
    stamper.close();
    reader.close();
}

@Test
public void testReplace() throws IOException, DocumentException {
    placeSignature(new File("src/test/resources/signature_test2.pdf"),
            new File("target/signature_test2.pdf"),
            new File("src/test/resources/signature.jpg"));
}

Namun, saat menjalankan tes, itulah hasil yang saya miliki:

enter image description here

Tampaknya aliran PDF dibagikan di semua tag gambar. Namun, saya hanya ingin mengubah konten untuk yang pertama. Jika saya menggunakan gambar lain untuk mengisi celah (dengan ukuran berbeda, misalnya), itu tidak akan diganti.

Pertanyaannya adalah, apakah ada solusi untuk masalah ini saat mengurai PDF atau apakah saya perlu menggunakan gambar yang berbeda untuk masing-masing placeholder saat membuat laporan di BIRT.

Ini adalah ke contoh file PDF.

1
Xtreme Biker 10 Januari 2018, 15:31

1 menjawab

Jawaban Terbaik

Halaman dalam PDF Anda hanya berisi satu sumber XObject gambar yang digunakan dalam sumber daya XObject bentuk tunggal yang digunakan tiga kali dalam aliran konten halaman.

Jadi, setelah Anda mengganti satu-satunya sumber gambar, semua penggunaan (tidak langsung) pada halaman tersebut menunjukkan gambar pengganti.

Jika Anda ingin mengubah ini menggunakan iText, Anda harus mengedit aliran konten dan mengganti instruksi untuk penggunaan formulir XObject dengan menggunakan gambar baru. Tetapi pertama-tama Anda harus mengidentifikasi penggunaan XObject mana yang ingin Anda ganti.

Non-sepele, khususnya jika template Birt dimaksudkan untuk menjadi agak fleksibel.

Saya sarankan Anda menggunakan gambar yang berbeda (menggunakan warna penanda yang berbeda) untuk lokasi yang berbeda di template laporan Anda. Ini tentu saja menjadi semakin sulit semakin banyak gambar placeholder seperti itu, khususnya jika jumlahnya dinamis dan dapat menjadi besar secara sewenang-wenang, mis. satu per entri kumpulan data dalam kumpulan data dengan jumlah entri yang tidak diketahui tetapi berpotensi besar.

2
mkl 10 Januari 2018, 13:20