PDF到bytearrayoutpustream空白
我有一个Java代码来创建一个PDF临时文件并保存到BLOB字段DB。 PDF正确生成,并且BLOB被保存到DB中。当我重新创建PDF时,这将返回没有空白字符!可能问题是bytearrayoutputstream的编码Base64。这是我的代码PDF到bytearrayoutpustream空白
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的字符串,然后将其放入压缩数据库,然后拉出来时,解压缩。这将确保没有任何更改,并将字符串处理为二进制。
我创建的创建具有iText的一个临时PDF文件的同时创建,其中我复制PDF文件的内容,然后保存ByteArrayOutputStream与另一方法.pdf文件一个ByteArrayOutputStream的方法通过电子邮件发送并且是正确的。然后,我创建了另一种方法,可以从DB返回PDF输出。该文件返回给我,但是,与消除抖动之间的空间:要清楚,如果我有这个句子中的原始PDF:“更多信息”从DB我的PDF文件再生:“Formoreinformation”。可能是什么问题呢? – 2012-01-11 13:44:33
你试过我说的吗?如果仍然存在问题,那么问题在于通过电子邮件进行传输,而不是从数据库传输,而这正是您最初暗示的。 – Alasdair 2012-01-11 15:13:24
你怎么不空格字符的意思?什么地方和什么地方缺少空白? – Alasdair 2012-01-11 11:08:55
当我重新创建PDF这个字符串“Permagiori dettagli sulle richieste di preventivo e eventual promozioni consultare l'estratto conto allegato”被写为“Permaggioridettaglisullerichiestedipreventivoeeventualipromozioniconsultarel'estrattocontoallegato” – 2012-01-11 11:21:57
PDF文件不能被修改而不完全腐败,所以如果有东西在文件中更改,那么你甚至不可能打开它。你确定这个错误不会发生在你原来的?另外,为什么你需要base64编码?你不能将它存储为二进制文件吗? – Alasdair 2012-01-11 11:25:52