1

我有一个 xml 文件和 .doj 模板文件。尝试使用 itext.jar 和 ACTRuntime.jar 下载 PDF。它在 java 1.6 和 Websphere 7 中工作,但在迁移到 java 8 和 websphere 8 后,它只是下载 PDF 格式的空白白页。下面是我用来生成 PDF 的代码。

public ByteArrayOutputStream generatePdf(){
    ArrayList<Object> bean = new ArrayList<Object>();

    BeanOne beanOne = new BeanOne();
    beanOne.setId(1);
    beanOne.setName("Sai");
    beanOne.setPhone("1234567890");

    BeanOne beanOne1 = new BeanOne();
    beanOne1.setId(2);
    beanOne1.setName("Ram");
    beanOne1.setPhone("9876543210");

    bean.add(beanOne);
    bean.add(beanOne1);

    AppDataHandler ds = new AppDataHandler();

    String tableName = "First Talbe";

    Object obj= bean.get(0);

    Vector fields = new Vector();
    fields.addElement("id = getId");
    fields.addElement("name = getName");
    fields.addElement("phone = getPhone");

    ds.registerObjectAsTable(obj, tableName, fields);
    ds.registerDataSet(tableName, bean);

    FileInputStream reportTemplateInputStream = new FileInputStream(new File("/template.jod"));

    ACJEngine acjEngine = new ACJEngine();
    acjEngine.readTemplate(reportTemplateInputStream);

    TemplateManager templateManager = acjEngine.getTemplateManager();
    templateManager.setLabel("ID", "ID");
    templateManager.setLabel("NAME", "NAME");
    templateManager.setLabel("PHONE", "PHONE");

    acjEngine.setX11GfxAvailibility(false);
    acjEngine.setDataSource(ds);
    ACJOutputProcessor ec = new ACJOutputProcessor();
    IViewerInterface ivi = acjEngine.generateReport();
    ByteArrayOutputStream generatedPDFStream = new ByteArrayOutputStream();
    ec.setPDFProperty("OutputStream", generatedPDFStream);
    ec.generatePDF();
    reportTemplateInputStream.close();
    Object[] pdfFromActuateArray = new Object[1];
    pdfFromActuateArray[0] = generatedPDFStream.toByteArray();
    return mergePdfsUsingItext(pdfFromActuateArray);
}

private ByteArrayOutputStream mergePdfsUsingItext(Object[] documents) throws com.itextpdf.text.DocumentException {
    ByteArrayOutputStream content = new ByteArrayOutputStream();
    int f;
    byte[] byteDoc = null;
    for (f = 0; f < documents.length; ++f) {
        byteDoc = (byte[]) documents[f];
        if (byteDoc != null)
            break;
    }
    PdfReader reader = new PdfReader(byteDoc);
    int n = reader.getNumberOfPages();
    Document document = new Document(reader.getPageSizeWithRotation(1));
    PdfWriter writer = PdfWriter.getInstance(document, content);
    document.open();
    PdfContentByte cb = writer.getDirectContent();
    PdfImportedPage page;
    int rotation;
    while (f < documents.length) {
        int i = 0;
        while (i < n) {
            i++;
            document.setPageSize(reader.getPageSizeWithRotation(i));
            document.newPage();
            page = writer.getImportedPage(reader, i);
            cb.addTemplate(page, 1f, 0, 0, 1f, 0, 0);
        }
        f++;
        if (f < documents.length) {
            reader = new PdfReader((byte[]) documents[f]);
            n = reader.getNumberOfPages();
        }
    }
    document.close();
    return content;
}

使用上面的代码,我得到了我在 jsp 页面上打印的 ByteArrayOutputStream,内容类型为 application/pdf。

结果pdf完全空白。希望有人可以解释这个问题。还请建议此代码的任何好的替代方案。

提前致谢。

4

0 回答 0