Java 找不到PDF标头签名

Java 找不到PDF标头签名,java,itext,Java,Itext,我有下面的iTextpdf创建代码,基本上我需要PdfStamper在代码的后面部分来呈现html内容,但是它在创建PdfStamper时抛出异常InvalidPdfException: public static void main(String[] args) throws IOException, DocumentException { String TEMP_PDF = "temp.pdf"; String RESULT = "output1.pdf";

我有下面的
iText
pdf创建代码,基本上我需要
PdfStamper
在代码的后面部分来呈现html内容,但是它在创建
PdfStamper
时抛出异常
InvalidPdfException

public static void main(String[] args) throws IOException, DocumentException {

        String TEMP_PDF = "temp.pdf";
        String RESULT = "output1.pdf";
        OutputStream osTemp = null;
        OutputStream osResult = null;
        PdfWriter writer = null;
        PdfReader reader=null;
        PdfStamper stamper=null;
        Document document = new Document(PageSize.LETTER);

        try {
            osTemp = new FileOutputStream(TEMP_PDF);
            osResult = new FileOutputStream(RESULT);
            writer = PdfWriter.getInstance(document, osTemp);
            reader = new PdfReader(TEMP_PDF);
            stamper = new PdfStamper(reader, osResult);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            osTemp.close();
            osResult.close();
            writer.close();
            reader.close();
            stamper.close();
        }
    }
编辑:

public void createPdf(String file) throws DocumentException, IOException {
        Document document = new Document(PageSize.LETTER);
        PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(file));
        document.open();
        int[] coords = new int[] {1, 50, 50, 100, 100} ;
        PdfContentByte canvas = pdfWriter.getDirectContent();
        ColumnText columnText = new ColumnText(canvas);
        String css = "";
        //llx, lly, urx, ury
        columnText.setSimpleColumn(coords[1], coords[2], coords[3], coords[4]);
        ElementList elements = XMLWorkerHelper.parseToElementList("<html><body><b>Bold text</b></body></html>", css);
        for (Element element : elements) {
            columnText.addElement(element);
        }
        columnText.go();
        document.close();
    }
public void createPdf(字符串文件)抛出DocumentException,IOException{
文档=新文档(页面大小.字母);
PdfWriter PdfWriter=PdfWriter.getInstance(文档,新文件输出流(文件));
document.open();
int[]coords=newint[]{1,50,50,100,100};
PdfContentByte canvas=pdfWriter.getDirectContent();
ColumnText ColumnText=新的ColumnText(画布);
字符串css=“”;
//llx,lly,urx,ury
columnText.setSimpleColumn(coords[1],coords[2],coords[3],coords[4]);
ElementList elements=XMLWorkerHelper.parseToElementList(“粗体文本”,css);
for(元素:元素){
columnText.addElement(元素);
}
columnText.go();
document.close();
}
您有两个问题:

问题1:

public void createPdf(String file) throws DocumentException, IOException {
        Document document = new Document(PageSize.LETTER);
        PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(file));
        document.open();
        int[] coords = new int[] {1, 50, 50, 100, 100} ;
        PdfContentByte canvas = pdfWriter.getDirectContent();
        ColumnText columnText = new ColumnText(canvas);
        String css = "";
        //llx, lly, urx, ury
        columnText.setSimpleColumn(coords[1], coords[2], coords[3], coords[4]);
        ElementList elements = XMLWorkerHelper.parseToElementList("<html><body><b>Bold text</b></body></html>", css);
        for (Element element : elements) {
            columnText.addElement(element);
        }
        columnText.go();
        document.close();
    }
PdfReader
只能读取真正的PDF文件。这些文件以
%PDF-1
开头,以
%%EOF
结尾。在您的情况下,您没有这样的文件。您正在阅读
TEMP\u PDF
,这是一个0字节的文件。在iText中,您可以分5步创建PDF文件。您只有创建过程的步骤1(创建文档)和步骤2(创建编写器)。您缺少步骤3(打开文档)、步骤4(添加内容)和步骤5(关闭文档)

在第5步之后,您只有一个完整的PDF文档。当您没有阅读完整的PDF时,您会得到一个
invalidPDException
,这是正常的

问题2:

public void createPdf(String file) throws DocumentException, IOException {
        Document document = new Document(PageSize.LETTER);
        PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(file));
        document.open();
        int[] coords = new int[] {1, 50, 50, 100, 100} ;
        PdfContentByte canvas = pdfWriter.getDirectContent();
        ColumnText columnText = new ColumnText(canvas);
        String css = "";
        //llx, lly, urx, ury
        columnText.setSimpleColumn(coords[1], coords[2], coords[3], coords[4]);
        ElementList elements = XMLWorkerHelper.parseToElementList("<html><body><b>Bold text</b></body></html>", css);
        for (Element element : elements) {
            columnText.addElement(element);
        }
        columnText.go();
        document.close();
    }
您可以这样写:我需要
PdfStamper
在代码的后面部分中呈现HTML内容


这是错误的
PdfStamper
是一个可用于在现有PDF文档上标记新内容(水印、表单字段值、页眉、页脚)的类。
PdfStamper
绝不会将PDF转换为HTML或将PDF呈现为HTML。

可能重复感谢您的回复。我遵循了5个步骤,然后使用了
PdfStamper
。很抱歉对问题2产生误解,实际上我提到的是OK,还有一件事:如果你用5个步骤创建PDF。为什么您仍然需要
PdfStamper
?在创建文档时,您不能在步骤4中使用
PdfStamper
添加要添加的内容吗?答案可以是“不”:你需要两个通行证可能有原因。我只是好奇。我想你是对的,你只是在解决我的问题:)我已经更新了我的问题,请看一下。它在不创建PdfStamper的情况下运行良好,这是一个良好的开端。但是,您需要查看更多的
ColumnText
示例。现在,所有不适合页面的内容都将丢失。您需要检查
go()
方法的返回值,并在必要时创建一个新页面。如果您根本不使用
ColumnText
,而是使用
document.add()
将元素添加到
document
中,可能会简单得多。