【问题标题】:PDF to bytearrayoutpustream whitespacePDF 到 bytearrayoutpustream 空白
【发布时间】:2012-01-11 10:27:17
【问题描述】:

我有一个 java 代码来创建一个 PDF 临时文件并将其保存到 BLOB 字段数据库中。 PDF 生成正确,BLOB 保存到 DB 中。当我重新创建 PDF 时,返回的不是空格字符!问题可能是 bytearrayoutputstream 的编码 Base64。这是我的代码

public ByteArrayOutputStream generaFatturaStampaPDF(Fattura fattura) {
    try {
        Document document = new Document(PageSize.A4, 72, 72, 120, 90);

        String tempdir = System.getProperty("java.io.tmpdir");

        if ( !(tempdir.endsWith("/") || tempdir.endsWith("\\")) )
           tempdir = tempdir + System.getProperty("file.separator");

        File tempFattura = File.createTempFile("fattura",".pdf", new File(tempdir));
        tempFattura.deleteOnExit();

        setFileTempFattura(tempFattura.toString());

        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(tempFattura));
        writer.setPdfVersion(PdfWriter.VERSION_1_7);
        writer.setPageEvent(new HeaderFooter());

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter docWriter = null;
        docWriter = PdfWriter.getInstance(document, baos);
        docWriter.setPdfVersion(PdfWriter.VERSION_1_7);
        docWriter.setPageEvent(new HeaderFooter());


        document.open();
        addMetaDataFattura(document);

        Font catFont = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD, BaseColor.BLACK);
        Paragraph paragrafoFattura = new Paragraph();
        paragrafoFattura.setAlignment(Element.ALIGN_CENTER);
        Chunk c = new Chunk("Fattura");
        c.setFont(catFont);
        paragrafoFattura.add(c);
        document.add(paragrafoFattura);

        intestazioneFatturaStampa(writer, fattura);
        intestazioneFatturaStampa(docWriter, fattura);
        addEmptyLine(document, 7);

        float[] widths = { 8f, 2f };
        PdfPTable table = new PdfPTable(widths);
        table.setHorizontalAlignment(Element.ALIGN_CENTER);
        table.setWidthPercentage(100);
        table.setHeaderRows(1);

        addCenterTableHeaderBold(table, "Descrizione", true, 12);
        addCenterTableHeaderBold(table, "Totale", true, 12);

        Double somma = 0.0;
        Iterator<FatturaDettaglio> iterator = fattura.getFatturaDettaglios().iterator();
        while (iterator.hasNext()) {
            FatturaDettaglio fatturaDettaglio = iterator.next();
            somma += fatturaDettaglio.getPrezzo();
        }
        addCenterTableHeaderBoldAllignLeft(table, fattura.getFatturaDettaglios().size()
                + " Richieste di Preventivo ", false, 12);
        addCenterTableHeaderBold(table, "€ " + arrotonda(somma), false, 12);

        Iterator<CreditoDebito> iterator2 = fattura.getCreditoDebitos().iterator();
        while (iterator2.hasNext()) {
            CreditoDebito creditoDebito = iterator2.next();

            addCenterTableHeaderBoldAllignLeft(table, creditoDebito.getNote(), false, 12);
            String segno = "";
            if (creditoDebito.getTipo().equals("C")) {
                segno = "-";
                somma = somma - creditoDebito.getImporto();
            }
            if (creditoDebito.getTipo().equals("D")) {
                segno = "";
                somma = somma + creditoDebito.getImporto();
            }
            addCenterTableHeaderBold(table, "€ " + segno
                    + arrotonda(creditoDebito.getImporto()), false, 12);
        }

        document.add(table);

        addEmptyLine(document, 2);

        float[] widths1 = { 2f, 1f };
        PdfPTable table1 = new PdfPTable(widths1);
        table1.setHorizontalAlignment(Element.ALIGN_RIGHT);
        table1.setWidthPercentage(60);

        addCenterTableHeader(table1, "Totale Imponibile netto", true);
        addCenterTableHeader(table1, "€ " + arrotonda(somma), false);

        addCenterTableHeader(table1, "IVA", true);
        addCenterTableHeader(table1, "€ " + arrotonda(somma * 20 / 100), false);

        addCenterTableHeader(table1, "Totale Fattura", true);
        addCenterTableHeader(table1, "€ " + arrotonda(somma + somma * 20 / 100), false);

        document.add(table1);

        addEmptyLine(document, 2);

        paragrafoFattura.setAlignment(Element.ALIGN_LEFT);
        Chunk datiPagamento =
                new Chunk("Dettagli pagamento:\nMetodo: "
                        + fattura.getAzienda().getMetodoPagamento()
                        + "\nIBAN:  IT xx X xxxxx xxxxx xxxxxxxxxxx");
        document.add(datiPagamento);
        addEmptyLine(document, 5);
        Chunk dettagliEstrattoContoTesto =
                new Chunk(
                        "Per maggiori dettagli sulle richieste di preventivo e eventuali promozioni consultare l'estratto conto allegato");
        dettagliEstrattoContoTesto.setFont(new Font(Font.FontFamily.TIMES_ROMAN, 10,
                Font.NORMAL, BaseColor.BLACK));
        document.add(dettagliEstrattoContoTesto);
        document.close();
        docWriter.close();

        return baos;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

【问题讨论】:

  • 没有空格字符是什么意思?空白是从什么地方丢失的?
  • 当我重新创建 PDF 时,这个字符串“Per maggiori dettagli sulle richieste di preventivo e eventuali promozioni Consultare l'estratto conto allegato”写成这个“Permaggioridettaglisullerichiestedipreventivoeeventualipromozioniconsultarel'estratocontoallegato”
  • PDF 文件无法在不完全损坏的情况下进行修改,因此如果文件中的某些内容发生更改,那么您甚至不可能打开它。您确定您的原件中不会出现此错误吗?另外,为什么需要base64编码?你不能把它存储为二进制吗?
  • PDF 文件正常!上面的代码创建 PDF 文件,并在一段时间内将此文档复制到 ByteArrayOutputStream 'PdfWriter.getInstance(document, baos);' PDF 是正确的,并且 baos 存储到数据库中。使用另一种方法,我从 DB 数据重新创建 PDF 文件,并在此文件(正确的 PDF 文件)中忽略字符串空格!
  • 对不起克劳迪奥,你说的不太明白。您需要找到一种更清楚地传达问题的方法,以便能够提供帮助。我不明白这个问题是从哪里或何时发生的。

标签: pdf blob bytearrayoutputstream


【解决方案1】:

尝试先压缩包含PDF的字符串,然后将其放入压缩的DB中,然后在将其拉出时将其解压缩。这将确保没有任何更改,并且字符串作为二进制处理。

【讨论】:

  • 我创建了一个方法,它使用 iText 创建一个临时 PDF 文件,同时创建一个 ByteArrayOutputStream,我在其中复制 PDF 文件的内容,然后使用另一种方法保存 ByteArrayOutputStream。PDF 文件通过电子邮件发送并是正确的。然后,我创建了另一种方法,该方法将数据库中的 PDF 输出返回给我。然而,这个文件被退回给我,震动之间的空格被消除了:要清楚我是否有句子中的原始 PDF:“更多信息”在来自 DB I 的 PDF 文件中重新生成:“更多信息”。可能是什么问题?
  • 你试过我说的了吗?如果仍然存在问题,则问题出在通过电子邮件传输,而不是从数据库传输,您最初暗示的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2015-04-22
  • 2014-10-15
  • 2013-12-22
相关资源
最近更新 更多