- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 iText 7 中有一个 java 程序,它接收 JSON 数据并生成一个 PDF 文档(带有页眉和页脚),它可以很好地处理变量 clientData
中的数据。在注释中,但在没有注释时使用该变量 clientData
不起作用,我收到此错误 java.lang.NullPointerException
,构建页眉和页脚时出现错误(在这一行 Rectangle pageSize = document.getPdfDocument().getPage(i).getPageSize();
),但不知道哪些数据为空,因为JSON数据和PDF的结构是一样的,我做错了什么?
这是所有的代码:
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.extgstate.PdfExtGState;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.element.Text;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.colors.Color;
import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.List;
import com.itextpdf.layout.element.ListItem;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;
import java.io.File;
import java.io.IOException;
import java.text.NumberFormat;
import java.util.Locale;
import org.json.JSONArray;
import org.json.JSONObject;
public class PDFGenerator {
public static final String DESTINATION = "path/exampleSMA.pdf";
public static void main(String[] args) throws Exception {
File file = new File(DEST);
file.getParentFile().mkdirs();
//WORK
//String clientData = "'{\"nombre_cliente\":\"Postobon\",\"contacto\":\"Kelly Paz\",\"email\":\"ventas@test.com\",\"telefono\":\"233774983\",\"observaciones\":\"\",\"totalizar\":true,\"mostrar_impuesto\":false,\"credito\":true,\"creador\":\"jplata\",\"creador_nombre\":\"JAIME ANTONIO\",\"creador_apellido\":\"PLATA BOGOYA\",\"cargo_asesor\":\"GERENTE\",\"email_asesor\":\"dyehuty@gmail.com\",\"productos\":[{\"modelo\":\"BOLSA ACCESORIOS ESTANDAR\",\"tela\":\"KAMBREL O POLITEX DE 70GR\",\"cantidad\":\"3000\",\"destino\":186,\"destino_label\":\"CALDAS - NEIRA\",\"ancho\":22,\"alto\":33,\"fuelle\":0,\"manija\":0,\"estampado_cara_frontal\":\"1 TINTA MATE\",\"estampado_cara_posterior\":\"2 TINTAS MATE\",\"valor_bolsa\":\"1605\",\"valor_iva\":\"304\",\"iva\":19,\"accesorios_modelo\":[{\"id\":\"1\",\"nombre\":\"CORDON ESTANDAR SENCILLO; PARA BOLSAS CIERRE CORDON O BOLERO.\",\"ancho\":0,\"alto\":0}],\"accesorios_adicionales\":[{\"id\":\"37\",\"nombre\":\"ESTE ACCESORIO SE USA PARA COLOCARLE BASE DE CARTON FORRADA EN EL MISMO MATERIAL A LA BOLSA. NORMALMENTE SE USA PARA LA BOLSA ANCHETA; PERO SE LE PUEDE COLOCAR A CUALQUIER BOLSA.\",\"ancho\":0,\"alto\":0},{\"id\":\"23\",\"nombre\":\"BOLSILLO EN EL MISMO MATERIAL DE LA BOLSA; SE USA PARA LA BOLSA AUTOGUARDABLE TIPO BILLETERA; O PARA CUALQUIER BOLSA QUE SE DESEE LLEVE UN BOLSILLO. EN LOS CAMPOS ALTO Y ANCHO; INDIQUE LAS DIMENSIONES DE ÉSTE BOLSILLO.\",\"ancho\":20,\"alto\":20},{\"id\":\"36\",\"nombre\":\"ESTE ACCESORIO ES UNA CAPA QUE SE COLOCA ENCIMA DEL CUBREVESTIDO. EN EL CAMPO ALTO: INDIQUE EL ALTO DE LA CAPERUZA.\",\"ancho\":0,\"alto\":22}],\"cantidadesReporte\":[{\"cantidad\":3000,\"valor_bolsa\":1605,\"valor_iva\":0,\"subtotal\":4815000,\"total\":4815000}]}]}'";
//NOT WORK
String clientData = "'{\"nombre_cliente\":\"MARCA DE PRUEBA\",\"contacto\":\"Harry\",\"email\":\"harry@test.com\",\"telefono\":\"4553773773\",\"observaciones\":\"\",\"totalizar\":false,\"mostrar_impuesto\":true,\"credito\":false,\"creador\":\"jvalderrama\",\"creador_nombre\":\"JUAN CARLOS\",\"creador_apellido\":\"VALDERRAMA GONZALEZ\",\"cargo_asesor\":\"desarrollador\",\"email_asesor\":\"dyehuty@gmail.com\",\"telefono_asesor\":\"2373719 EXT 1147 - 5138731 - 8033205\",\"celular_asesor\":\"3149008989\",\"productos\":[{\"modelo\":\"BOLSA ACCESORIOS CIERRE ESPECIAL\",\"tela\":\"KAMBREL O POLITEX DE 70GR\",\"cantidad\":\"300,600,1000\",\"destino\":4,\"destino_label\":\"ANTIOQUIA - BARBOSA\",\"ancho\":23,\"alto\":44,\"fuelle\":0,\"manija\":0,\"estampado_cara_frontal\":\"1 TINTA MATE\",\"estampado_cara_posterior\":\"SIN ESTAMPADO\",\"estampado_fuelle_izquierdo\":\"SIN ESTAMPADO\",\"estampado_fuelle_derecho\":\"SIN ESTAMPADO\",\"estampado_fuelle_base\":\"SIN ESTAMPADO\",\"valor_bolsa\":\"1543,1202,1151\",\"valor_iva\":\"293,228,218\",\"iva\":19,\"accesorios_modelo\":[],\"accesorios_adicionales\":[{\"id\":\"37\",\"nombre\":\"BASE DE CARTON FORRADO\",\"descripcion\":\"ESTE ACCESORIO SE USA PARA COLOCARLE BASE DE CARTON FORRADA EN EL MISMO MATERIAL A LA BOLSA. NORMALMENTE SE USA PARA LA BOLSA ANCHETA,PERO SE LE PUEDE COLOCAR A CUALQUIER BOLSA.\",\"ancho\":2,\"alto\":0}],\"cantidadesReporte\":[{\"cantidad\":300,\"valor_bolsa\":1543,\"valor_iva\":87900,\"subtotal\":462900,\"total\":550800},{\"cantidad\":600,\"valor_bolsa\":1202,\"valor_iva\":136800,\"subtotal\":721200,\"total\":858000},{\"cantidad\":1000,\"valor_bolsa\":1151,\"valor_iva\":218000,\"subtotal\":1151000,\"total\":1369000}]},{\"modelo\":\"BOLSA ACCESORIOS CIERRE ESPECIAL\",\"tela\":\"YUTE LAMINADO COLOR CRUDO\",\"cantidad\":\"300,600,1000\",\"destino\":4,\"destino_label\":\"ANTIOQUIA - BARBOSA\",\"ancho\":23,\"alto\":44,\"fuelle\":0,\"manija\":0,\"estampado_cara_frontal\":\"1 TINTA MATE\",\"estampado_cara_posterior\":\"SIN ESTAMPADO\",\"estampado_fuelle_izquierdo\":\"SIN ESTAMPADO\",\"estampado_fuelle_derecho\":\"SIN ESTAMPADO\",\"estampado_fuelle_base\":\"SIN ESTAMPADO\",\"valor_bolsa\":\"6439,5016,4830\",\"valor_iva\":\"1223,953,917\",\"iva\":19,\"accesorios_modelo\":[],\"accesorios_adicionales\":[{\"id\":\"37\",\"nombre\":\"BASE DE CARTON FORRADO\",\"descripcion\":\"ESTE ACCESORIO SE USA PARA COLOCARLE BASE DE CARTON FORRADA EN EL MISMO MATERIAL A LA BOLSA. NORMALMENTE SE USA PARA LA BOLSA ANCHETA,PERO SE LE PUEDE COLOCAR A CUALQUIER BOLSA.\",\"ancho\":2,\"alto\":0}],\"cantidadesReporte\":[{\"cantidad\":300,\"valor_bolsa\":6439,\"valor_iva\":366900,\"subtotal\":1931700,\"total\":2298600},{\"cantidad\":600,\"valor_bolsa\":5016,\"valor_iva\":571800,\"subtotal\":3009600,\"total\":3581400},{\"cantidad\":1000,\"valor_bolsa\":4830,\"valor_iva\":917000,\"subtotal\":4830000,\"total\":5747000}]},{\"modelo\":\"BOLSA ACCESORIOS CIERRE ESPECIAL\",\"tela\":\"TELA DE SUBLIMAR EN KAMB. DE 70GR\",\"cantidad\":\"300,600,1000\",\"destino\":4,\"destino_label\":\"ANTIOQUIA - BARBOSA\",\"ancho\":23,\"alto\":44,\"fuelle\":0,\"manija\":0,\"estampado_cara_frontal\":\"1 TINTA MATE\",\"estampado_cara_posterior\":\"SIN ESTAMPADO\",\"estampado_fuelle_izquierdo\":\"SIN ESTAMPADO\",\"estampado_fuelle_derecho\":\"SIN ESTAMPADO\",\"estampado_fuelle_base\":\"SIN ESTAMPADO\",\"valor_bolsa\":\"1906,1485,1423\",\"valor_iva\":\"362,282,270\",\"iva\":19,\"accesorios_modelo\":[],\"accesorios_adicionales\":[{\"id\":\"37\",\"nombre\":\"BASE DE CARTON FORRADO\",\"descripcion\":\"ESTE ACCESORIO SE USA PARA COLOCARLE BASE DE CARTON FORRADA EN EL MISMO MATERIAL A LA BOLSA. NORMALMENTE SE USA PARA LA BOLSA ANCHETA,PERO SE LE PUEDE COLOCAR A CUALQUIER BOLSA.\",\"ancho\":2,\"alto\":0}],\"cantidadesReporte\":[{\"cantidad\":300,\"valor_bolsa\":1906,\"valor_iva\":108600,\"subtotal\":571800,\"total\":680400},{\"cantidad\":600,\"valor_bolsa\":1485,\"valor_iva\":169200,\"subtotal\":891000,\"total\":1060200},{\"cantidad\":1000,\"valor_bolsa\":1423,\"valor_iva\":270000,\"subtotal\":1423000,\"total\":1693000}]}]}'";
new PDFGenerator().createPdf(DEST, clientData);
}
public void createPdf(String dest, String data) throws IOException {
data = data.replace("'","");
JSONObject jsonPeticion = new JSONObject(data);
JSONArray jsonProductos= jsonPeticion.getJSONArray("productos");
boolean mostrarIva = jsonPeticion.getBoolean("mostrar_impuesto");
NumberFormat formateador = NumberFormat.getInstance(new Locale("us", "US"));
formateador.setMinimumFractionDigits(0);
formateador.setMaximumFractionDigits(0);
System.out.println("JSON ARRAY......" + jsonProductos);
System.out.println("JSON ARRAY LENGTH......" + jsonProductos.length());
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
try (Document document = new Document(pdf)) {
document.setMargins(120, 36, 120, 36);
document.add(new Paragraph("ESPECIFICACIONES TÉCNICAS DEL PRODUCTO")
.setTextAlignment(TextAlignment.CENTER)
.setBold());
for (int i = 0; i < jsonProductos.length(); i++) {
Text textoTinta = new Text("Tinta Utilizada");
textoTinta.setUnderline(1.5f, -1);
textoTinta.setTextAlignment(TextAlignment.LEFT);
Text textoTintaDescripcion = new Text(": Las tintas que usamos son 100% Ecológicas y Base Agua, "
+ "nuestra visión no es solo comercial sino de responsabilidad "
+ "con el medio ambiente y social.");
Text textoNota = new Text("NOTA: ").setBold();
textoNota.setTextAlignment(TextAlignment.LEFT);
Text textoNotaDescripcion = new Text("Señor cliente por favor tener presente, que en el momento "
+ "de la facturación, debemos facturar todo lo que salga, normalmente "
+ "puede salir un 5% de más o de menos.");
document.add(new Paragraph(textoTinta).add(textoTintaDescripcion)
.setTextAlignment(TextAlignment.JUSTIFIED));
document.add(new Paragraph(textoNota).add(textoNotaDescripcion)
.setTextAlignment(TextAlignment.JUSTIFIED));
String IMG = "C:\\path\\images\\logoSmallBiobolsa.png";
String FONT = "C:\\path\\COMIC.ttf";
ImageData imageData = ImageDataFactory.create(IMG);
Image pdfImg = new Image(imageData);
pdfImg.setWidth(70);
pdfImg.setHeight(77);
Color verdeBioBolsa = new DeviceRgb(5, 94, 27);
PdfFont comic = PdfFontFactory.createFont(FONT, true);
System.out.println("MARGENES SUPERIOR..... " + document.getTopMargin());
System.out.println("MARGENES INFERIOR..... " + document.getBottomMargin());
System.out.println("MARGENES IZQUIERDO..... " + document.getLeftMargin());
System.out.println("MARGENES DERECHO..... " + document.getRightMargin());
Paragraph headerImg = new Paragraph("").add(pdfImg);
Paragraph headerNombreEmpresa = new Paragraph("BIO BOLSA S.A.S")
.setFont(comic)
.setFontSize(20)
.setBold()
.setFontColor(verdeBioBolsa);
Paragraph headerSlogan = new Paragraph("!!Una Empresa con Conciencia Ambiental!!")
.setFont(comic)
.setFontSize(14)
.setFontColor(verdeBioBolsa);
Paragraph headerRegimen = new Paragraph("Régimen Común")
.setFont(comic)
.setFontSize(12)
.setBold()
.setFontColor(verdeBioBolsa);
Paragraph headerIdentificador = new Paragraph("NIT: 900.390.537-1")
.setFont(comic)
.setFontSize(12)
.setFontColor(verdeBioBolsa);
Paragraph footerTelefonosAsesor = new Paragraph("Tels: (57) (1) 7137516 EXT 1142 – 7138731 - 2033205 Cel: (57) 300 275 45 51")
.setFontSize(10)
.setFontColor(verdeBioBolsa);
Paragraph footerWebEmail = new Paragraph("Web: www.biobolsa.com.co E-mail: pchacon@biobolsa.com.co")
.setFontSize(10)
.setFontColor(verdeBioBolsa);
Paragraph footerDireccion = new Paragraph("Fábrica CRA 57 NO 45 A – 52 SUR LA SEVILLANA")
.setFontSize(10)
.setFontColor(verdeBioBolsa);
Paragraph footerCiudad = new Paragraph("Bogotá D.C, Colombia")
.setFontSize(10)
.setFontColor(verdeBioBolsa);
for (int i = 1; i <= document.getPdfDocument().getNumberOfPages(); i++) {
System.out.println("PAGINA DEL PDF" + i);
try {
Rectangle pageSize = document.getPdfDocument().getPage(i).getPageSize();
//Rectangle pageSize = document.getPdfDocument().getPage(i).getMediaBox();
System.out.println("RECTANGLE....." + pageSize);
} catch (Exception e) {
// TODO: handle exception
System.out.println("EXCEPCION RECTANGULO..." + e);
}
}
}
}
}
最佳答案
简而言之
问题是由于您的代码访问了 iText 已经从内存中刷新到目标文件的页面。您可以使用三个参数 Document
指示 iText 不要提前刷新页面。构造函数并设置 immediateFlush
false
的参数,即通过替换
try (Document document = new Document(pdf)) {
try (Document document = new Document(pdf, pdf.getDefaultPageSize(), false)) {
null
.
NullPointerException
尝试访问页面大小时。
data
提供 JSON 字符串,因此您甚至无法执行该代码来重现该问题。范围。因此,为了能够重现该问题,我不得不将您的代码缩减为重现该问题的基本核心:
public void createPdf(String dest) throws IOException {
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
try (Document document = new Document(pdf)) {
document.setMargins(120, 36, 120, 36);
document.add(new Paragraph("some content"));
document.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
document.add(new Paragraph("some more content"));
document.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
document.add(new Paragraph("still more content"));
for (int i = 1; i <= document.getPdfDocument().getNumberOfPages(); i++) {
System.out.println("PAGINA DEL PDF" + i);
try {
Rectangle pageSize = document.getPdfDocument().getPage(i).getPageSize();
// Rectangle pageSize = document.getPdfDocument().getPage(i).getMediaBox();
System.out.println("RECTANGLE....." + pageSize);
} catch (Exception e) {
// TODO: handle exception
System.out.println("EXCEPCION RECTANGULO..." + e);
}
}
}
}
关于java - 如何获取 pdf 文档 iText 7 的页面大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60698558/
我有一个 .sln 文件,里面有几个项目。为了简单起见,让我们称它们为... 项目A 项目B 项目C ...其中 A 是引用 B 和 C 的主要项目。我的目标是更新我的构建脚本,为 ProjectA
我安装了 Magento,我想知道如何生成完整的 API 文档,例如 http://docs.magentocommerce.com/ 上的文档是使用 phpdoc 生成的。 Magento 中是否包
我通常使用jetbrains family ide。在为函数创建文档时非常有用,只需输入 /** 如何在创建文档时创建自定义标签,例如@date标签。 最佳答案 JavaScript、Java: st
我正在尝试使用 jOpenDocument library创建文档。我已经执行了创建电子表格的示例 - 代码编译并运行正常,但当我尝试使用 Excel Office 2012 或 Google Doc
如标题。 有没有介绍HTML DOM构造的图片? 最佳答案 DOM(文档 对象模型)从文档 节点开始。它被称为“根节点”。 观察下面的树(括号中对应的nodeType): [HTMLDocument]
我喜欢 ColdFusion Builder。但我不喜欢帮助只有 CF9 文档。有什么方法可以将其更改为拥有 ColdFusion 8 文档? 最佳答案 http://livedocs.adobe.c
这个问题在这里已经有了答案: What is the consequence of this bit of javascript? (4 个答案) 关闭 9 年前。 我看到一些 jQuery 脚本嵌
我有一个 XML 文件,其中包含需要在 Word 文档中填充的数据。 我需要找到一种方法来定义一个模板,该模板可用作从 XML 文件填充数据并创建输出文档的基线。 我相信有两种方法可以做到这一点。 创
我正在尝试查找有关如何使用 AVAudioEngine 的详细文档。有谁知道我在哪里可以找到它? 我找到了这个,但与文档丰富的 UI 内容相比,它似乎非常简陋。 https://developer.a
我对 Tensorflow 文档越来越感到恼火和沮丧。我在谷歌上搜索了有关 的文档 tf.reshape 我被定向到一个通用页面,例如 here 。我想查看 tf.reshape 的详细信息,而不是整
我正在学习本教程:http://moxleystratton.com/clojure/clojure-tutorial-for-the-non-lisp-programmer 然后遇到了这个片段: u
如何在 swagger 中为对象数组编写文档。这是我的代码,但我不知道如何访问对象数组中的数据。 { "first_name":"Sam", "last_name":"Smith",
是否有针对 Javascript 的 JavaDocs 之类的东西?当我在 netbeans IDE 中按 ctrl+space 时 写javascript,指定对象的javascript文档就出来了
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
我需要 JavaScript 中的 heredoc 之类的东西。你对此有什么想法吗?我需要跨浏览器功能。 我发现了这个: heredoc = '\ \ \ zzz\ \
WSDL 文档是包含一系列的,可描述某个 web service 的定义的,简单的 XML 文档 WSDL 文档结构 WSDL 文档用下表这些主要的元素来描述某个 web service 的
是否有 ocropus 的文档? 我正在寻找对以下功能的解释: make_SegmentPageByRAST(): segment() RegionExtractor(): setPageLines(
这个问题在这里已经有了答案: Understanding events and event handlers in C# (13 个回答) 4年前关闭。 我正在使用 NRECO 和 ffmpeg 对视
我正在尝试访问工作服务器以与名为 Spotfire 的应用程序一起使用。我的同事把这个传给我,现在已经休息了几个星期,我对他的建议有意见。 实际上,当我通过 localhost 运行我的 Web 应用
Elm 文档没有给出示例用法,因此很难理解类型规范的含义。在几个地方,我看到“a”用作参数标识符,例如 Platform.Cmd : map : (a -> msg) -> Cmd a -> Cmd
我是一名优秀的程序员,十分优秀!