精华内容
下载资源
问答
  • 在控制台只输出了第一页的内容,其余的都没有读出来,控制台的信息是: 2012-7-31 11:22:26 org.apache.pdfbox.util.PDFStreamEngine processOperator 信息: unsupported/disabled operation: EI ...
  • 代码如下,读取pdf文件时,出现中文字符乱码的情况,求大神解决。。 ![图片说明](https://img-ask.csdn.net/upload/201512/01/1448957510_127034.png) package read; import java.io.FileInputStream; import ...
  • 今天做PDF文件解析,遇到一个需求:提取文件中的图片并保存。使用的是流行的apache开源jar包pdfbox, 但还是遇到坑了,比如pdfbox版本太高或太低都不能用!!这个包竟然没有很好地做好兼容问题,有些方法在高版本说...

    今天做PDF文件解析,遇到一个需求:提取文件中的图片并保存。使用的是流行的apache开源jar包pdfbox, 但还是遇到坑了,比如pdfbox版本太高或太低都不能用!!这个包竟然没有很好地做好兼容问题,有些方法在高版本说舍弃就舍弃了。暂时没有时间去研究版本间的区别。以下给我这个问题的解决方案。

    pdfbox版本:1.8.13

    maven传送门:

    org.apache.pdfbox

    pdfbox

    1.8.13

    代码:

    package com.tbd.util;

    import java.io.File;

    import java.io.IOException;

    import java.util.Iterator;

    import java.util.List;

    import java.util.Map;

    import org.apache.pdfbox.pdmodel.PDDocument;

    import org.apache.pdfbox.pdmodel.PDPage;

    import org.apache.pdfbox.pdmodel.PDResources;

    import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;

    /**

    * 提取PDF中的图片

    * pdfbox 版本 1.8.13

    * @author Charlie Wu

    * 2018/05/24

    */

    public class PDF2Image {

    /**

    * 提取

    * @param filePDF文件

    * @param targetFolder 图片存放目录

    * @return

    */

    public static boolean extractImages(File file, String targetFolder) {

    boolean result = true;

    try{

    PDDocument document = PDDocument.load(file);

    List pages = document.getDocumentCatalog().getAllPages();

    Iterator iter = pages.iterator();

    int count = 0;

    while( iter.hasNext()){

    PDPage page = (PDPage)iter.next();

    PDResources resources = page.getResources();

    Map images = resources.getImages();

    if(images != null)

    {

    Iterator imageIter = images.keySet().iterator();

    while(imageIter.hasNext())

    {

    count++;

    String key = (String)imageIter.next();

    PDXObjectImage image = (PDXObjectImage)images.get( key );

    String name = file.getName() + "_" + count;// 图片文件名

    image.write2file(targetFolder + name);// 保存图片

    }

    }

    }

    } catch(IOException ex){

    ex.printStackTrace();

    return false;

    }

    return result;

    }

    public static void main(String[] args) {

    File file = new File("F:/test.pdf");

    String targerFolder = "F:/target/";

    extractImages(file, targerFolder);

    }

    }

    展开全文
  • 将HTTP响应数据生成PDF,这...区分字符、字节这里可以百度一下,但是简言之就是:java中提供了专用于输入输出功能的包Java.io,其中包括: InputStream,OutputStream,Reader,Writer InputStream 和OutputStream...

    将HTTP响应数据生成PDF,这一步的话,就比较坑,浪费了好多时间,查了很多资料,也是我想把它记录下来的主要原因,

    废话少说,先说踩的坑

    1.区分字符流、字节流

    这里可以百度一下,但是简言之就是:

    java中提供了专用于输入输出功能的包Java.io,其中包括:     InputStream,OutputStream,Reader,Writer     InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象,     Reader和 Writer.两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串.

    所以,PDF 必须要用字节流来处理

    2.根据响应确定生成的文件pdf

    connection.getContentType()=application/pdf  即导出为pdf文件

    3.数据流的处理

    //FilePath=FilePath+".pdf";

    //File f =new File(FilePath);

    //OutputStream out =  new BufferedOutputStream(new FileOutputStream(f));

    //java.io.InputStream is = new BufferedInputStream(connection.getInputStream());

    //

    //byte[] flash = new byte[2048];

    //int len;

    //while((len=is.read(flash))>0){

    System.out.println(new String(flash));

    //out.write(flash, 0, flash.length);

    //}

    //out.flush();

    上述方法,用以上方法后,发现导出报表很不稳定,总数报错,或者数据丢失的现象,截图所示,因此上述方法不可取

    之后咨询开发,对代码进行了优化,代码贴出来

    用到了ByteArrayOutputStream和iText生成PDF文档类

    FilePath=FilePath+".pdf";

    File f =new File(FilePath);

    FileOutputStream fo = new FileOutputStream(f);

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    for(int i;(i=connection.getInputStream().read())!=-1;){

    baos.write(i);

    }

    baos.flush();

    Document doc = new Document();

    PdfStream pdfStream=new PdfStream(baos.toByteArray());

    PdfWriter pw =null;

    try {

    pw = PdfWriter.getInstance(doc, fo);

    } catch (DocumentException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    pdfStream.toPdf(pw,fo);

    pw.flush();

    baos.close();

    pw.close();

    fo.close();

    4.PDF文件的读取

    也是从网上找的,两种方法都可以用,代码如下:

    public static String getPdfFileText(String fileName) throws IOException {

    PdfReader reader = new PdfReader(fileName);

    PdfReaderContentParser parser = new PdfReaderContentParser(reader);

    StringBuffer buff = new StringBuffer();

    TextExtractionStrategy strategy;

    for (int i = 1; i <= reader.getNumberOfPages(); i++) {

    //strategy = parser.processContent(i,  new SimpleTextExtractionStrategy());

    //buff.append(strategy.getResultantText());

    buff.append(PdfTextExtractor.getTextFromPage(reader, i));

    //System.out.println("编号:"+i+"    "+PdfTextExtractor.getTextFromPage(reader, i));

    }

    return buff.toString();

    }

    展开全文
  • 遇到的问题在用socket通信传输一个pdf文件以及其他的非txt文件的时候总是传到服务端的文件出错,后来发现是在用字符和字节在读取各种文件上的差别所导致的java读取文件的方式字节读取:InputStream和...

    遇到的问题

    在用socket通信传输一个pdf文件以及其他的非txt文件的时候总是传到服务端的文件出错,后来发现是在用字符流和字节流在读取各种文件上的差别所导致的

    java读取文件的方式

    字节流读取:InputStream和OutPutStream,其读取的方式按字节读取,这个常用于读取原始数据。

    字符流读取:Reader和Writer,按字节读取数据,java里面一个字符对应两个字节

    为什么会有时候会出现乱码

    在计算机中常会涉及到编码问题,那么在字符流读取文件的时候也会遇到一些问题,典型的就是在读取txt文件的时候再保存遇到的乱码,在java里面一个字符对应两个字节,但是在UTF-8的编码中有时候一个汉字可能对应的是三个字节,那么这个时候在读取的时候不指定编码的话会造成读取文件的乱码现象

    一个txt文件假设是GBK编码的话,在以字符流读取的时候若依GBK读取就会造成问题

    测试(JDK1.8,IDEA,默认编码UTF-8,txt文件编码GBK)

    测试一

    写了一个代码测试了下:

    在以字节流去读取pdf格式和其他格式的文件都没问题,但是字节流读取之后保存为String再写入文件会导致pdf等文件出错:代码如下

    此时会导致pdf文件全部是白的,音乐等文件全部错误,而且txt格式的文件的文字全部变成拷斤棍,至于拷斤棍百度了下是由于字符编码问题,

    File file1 =new File("D:\\disk\\1\\README.doc");

    File file2 =new File("D:\\disk\\tes.doc");

    Reader reader =new InputStreamReader(new FileInputStream(file1));

    int len;

    char[] a =new char[1024];

    StringBuffer sb =new StringBuffer();

    while ((len=reader.read(a))!= -1) //以字节流去读pdf文件

    {

    sb.append(new String(a,0,len));

    }

    reader.close();

    FileWriter fileWriter = new FileWriter(file2); // 将读取出来的额String数据直接写入

    fileWriter.write(sb.toString());

    fileWriter.flush();

    fileWriter.close();

    测试二

    将读取之后的String再次变为字节流然后再进行读取再直接以字节流写入:

    此时如同前面一个代码结果一样,除了txt有编码问题之外的文件都有问题

    // File file1= new File("D:\\disk\\1\\Java锁.pdf");

    // File file2 =new File("D:\\disk\\test1.pdf");

    // File file1 =new File("D:\\disk\\1\\Java锁.txt");

    // File file2 =new File("D:\\disk\\test1.txt");

    // File file1 =new File("D:\\disk\\1\\Unit.wma");

    // File file2 =new File("D:\\disk\\test1.wma");

    File file1 =new File("D:\\disk\\1\\README.doc");

    File file2 =new File("D:\\disk\\test1.doc");

    InputStream in =null;

    OutputStream out =null;

    try{

    in= new FileInputStream(file1);

    byte[] bytes= new byte[1024];

    int read =0;

    StringBuffer sb =new StringBuffer();

    while ((read =in.read(bytes))!= -1)

    {

    sb.append(new String(bytes,0,read));

    }

    System.out.println("a");

    InputStream inputStream =new ByteArrayInputStream(sb.toString().getBytes());

    byte[] re =new byte[1024];

    int haveRead= 0;

    FileOutputStream fileOutputStream =new FileOutputStream(file2);

    while ((haveRead =inputStream.read(re))!= -1)

    {

    fileOutputStream.write(re,0,haveRead);

    }

    } catch (FileNotFoundException e1) {

    e1.printStackTrace();

    } catch (IOException e1) {

    e1.printStackTrace();

    }finally {

    in.close();

    }

    }

    测试三:

    全部以GBK格式读取和以GBK格式写入,除了txt文件正常以外其他的文件全部出错

    File file1 =new File("D:\\disk\\1\\Java锁.txt");

    // File file2 =new File("D:\\disk\\test4.txt");

    // File file1 =new File("D:\\disk\\1\\Unit.wma");

    // File file2 =new File("D:\\disk\\test4.wma");

    File file1 =new File("D:\\disk\\1\\README.doc");

    File file2 =new File("D:\\disk\\test4.doc"); //拷斤棍

    FileInputStream fileInputStream =new FileInputStream(file1);

    Reader reader =new InputStreamReader(fileInputStream,"GBK"); // txt测试GBK结果正确 DOC测试以UTF-8测试结果:拷斤棍 //

    char[] chars =new char[1024];

    int read=0;

    StringBuffer sb =new StringBuffer();

    while((read=reader.read(chars))!= -1)

    {

    sb.append(new String(chars,0,read));

    }

    FileOutputStream fileOutputStream =new FileOutputStream(file2);

    Writer writer =new OutputStreamWriter(fileOutputStream,"GBK");

    writer.write(sb.toString());

    writer.flush();

    writer.close();

    所以在java里面对文件的读写最好以字节流写入:此时无论是各种文件都没问题,对于字符流的使用感觉是在一些需要编码的文件,即类似于txt的文本文件。

    File file1 =new File("D:\\disk\\1\\Java锁.pdf");

    // File file2 =new File("D:\\disk\\copy.pdf");

    // File file1 =new File("D:\\disk\\1\\Java锁.txt");

    // File file2 =new File("D:\\disk\\copy.txt");

    // File file1 =new File("D:\\disk\\1\\Unit.wma");

    // File file2 =new File("D:\\disk\\copy.wma");

    File file1 =new File("D:\\disk\\1\\README.doc");

    File file2 =new File("D:\\disk\\copy.doc");

    InputStream in =null;

    OutputStream out =null;

    try{

    in= new FileInputStream(file1);

    out=new FileOutputStream(file2);

    byte[] bytes= new byte[1024];

    int read =0;

    StringBuffer sb =new StringBuffer();

    while ((read =in.read(bytes))!= -1)

    {

    out.write(bytes,0,read); // 直接以字节流的方式输出到文件

    }

    } catch (FileNotFoundException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }finally {

    in.close();

    out.close();

    }

    全部代码

    import java.io.*;

    /**

    * Created by szh on 2017/3/26.

    */

    public class FileTest {

    /*

    文件以字节流读取

    1.以这种方式读取非文档的

    */

    public static void tes() throws IOException {

    // File file1 =new File("D:\\disk\\1\\Java锁.pdf");

    // File file2 =new File("D:\\disk\\tes.pdf");

    // File file1 =new File("D:\\disk\\1\\Java锁.txt");

    // File file2 =new File("D:\\disk\\tes.txt");

    // File file1 =new File("D:\\disk\\1\\Unit.wma");

    // File file2 =new File("D:\\disk\\tes.wma");

    File file1 =new File("D:\\disk\\1\\README.doc");

    File file2 =new File("D:\\disk\\tes.doc");

    Reader reader =new InputStreamReader(new FileInputStream(file1));

    int len;

    char[] a =new char[1024];

    StringBuffer sb =new StringBuffer();

    while ((len=reader.read(a))!= -1) //以字节流去读pdf文件

    {

    sb.append(new String(a,0,len));

    }

    reader.close();

    FileWriter fileWriter = new FileWriter(file2); // 将读取出来的额String数据直接写入

    fileWriter.write(sb.toString());

    fileWriter.flush();

    fileWriter.close();

    }

    /*

    以字节流来读取文件

    */

    public static void test2() throws IOException {

    // File file1 =new File("D:\\disk\\1\\Java锁.pdf");

    // File file2 =new File("D:\\disk\\test2.pdf");

    // File file1 =new File("D:\\disk\\1\\Java锁.txt");

    // File file2 =new File("D:\\disk\\test2.txt");

    // File file1 =new File("D:\\disk\\1\\Unit.wma");

    // File file2 =new File("D:\\disk\\test2.wma");

    File file1 =new File("D:\\disk\\1\\README.doc");

    File file2 =new File("D:\\disk\\test2.doc");

    byte[] sendBytes = new byte[1024];

    int length = 0;

    StringBuffer sb =new StringBuffer();

    FileInputStream fileInputStream =new FileInputStream(file1);

    while((length = fileInputStream.read(sendBytes, 0, sendBytes.length)) > 0){ // 将文件读取为String

    sb.append(new String(sendBytes, 0, length));

    }

    FileWriter fileWriter = new FileWriter(file2); // 这里会导致读取出来的txt文字都是拷斤棍

    fileWriter.write(sb.toString());

    fileWriter.flush();

    fileWriter.close();

    }

    /*

    以字节流读取但是不读取为String

    */

    public static void copy() throws IOException {

    // File file1 =new File("D:\\disk\\1\\Java锁.pdf");

    // File file2 =new File("D:\\disk\\copy.pdf");

    // File file1 =new File("D:\\disk\\1\\Java锁.txt");

    // File file2 =new File("D:\\disk\\copy.txt");

    // File file1 =new File("D:\\disk\\1\\Unit.wma");

    // File file2 =new File("D:\\disk\\copy.wma");

    File file1 =new File("D:\\disk\\1\\README.doc");

    File file2 =new File("D:\\disk\\copy.doc");

    InputStream in =null;

    OutputStream out =null;

    try{

    in= new FileInputStream(file1);

    out=new FileOutputStream(file2);

    byte[] bytes= new byte[1024];

    int read =0;

    StringBuffer sb =new StringBuffer();

    while ((read =in.read(bytes))!= -1)

    {

    out.write(bytes,0,read); // 直接以字节流的方式输出到文件

    }

    } catch (FileNotFoundException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }finally {

    in.close();

    out.close();

    }

    }

    /*

    将文件以字节流的方式读取文件转为String但是又重新将String转为字节流然后写入

    */

    public static void test1() throws IOException {

    // File file1= new File("D:\\disk\\1\\Java锁.pdf");

    // File file2 =new File("D:\\disk\\test1.pdf");

    // File file1 =new File("D:\\disk\\1\\Java锁.txt");

    // File file2 =new File("D:\\disk\\test1.txt");

    // File file1 =new File("D:\\disk\\1\\Unit.wma");

    // File file2 =new File("D:\\disk\\test1.wma");

    File file1 =new File("D:\\disk\\1\\README.doc");

    File file2 =new File("D:\\disk\\test1.doc");

    InputStream in =null;

    OutputStream out =null;

    try{

    in= new FileInputStream(file1);

    byte[] bytes= new byte[1024];

    int read =0;

    StringBuffer sb =new StringBuffer();

    while ((read =in.read(bytes))!= -1)

    {

    sb.append(new String(bytes,0,read));

    // out.write(bytes,0,read);

    System.out.println(read+"-----------read的值");

    }

    System.out.println("a");

    InputStream inputStream =new ByteArrayInputStream(sb.toString().getBytes());

    byte[] re =new byte[1024];

    int haveRead= 0;

    FileOutputStream fileOutputStream =new FileOutputStream(file2);

    while ((haveRead =inputStream.read(re))!= -1)

    {

    fileOutputStream.write(re,0,haveRead);

    }

    } catch (FileNotFoundException e1) {

    e1.printStackTrace();

    } catch (IOException e1) {

    e1.printStackTrace();

    }finally {

    in.close();

    }

    }

    /*

    修改编码

    */

    public static void test3() {

    // File file1 =new File("D:\\disk\\1\\Java锁.pdf");

    // File file2 =new File("D:\\disk\\copy.pdf");

    // File file1 = new File("D:\\disk\\1\\Java锁.txt");

    // File file2 = new File("D:\\disk\\test3.txt");

    // File file1 =new File("D:\\disk\\1\\Unit.wma");

    // File file2 =new File("D:\\disk\\test3.wma");

    File file1 =new File("D:\\disk\\1\\README.doc");

    File file2 =new File("D:\\disk\\test3.doc");

    InputStream in = null;

    OutputStream out = null;

    try {

    in = new FileInputStream(file1);

    out = new FileOutputStream(file2);

    byte[] bytes = new byte[1024];

    int read = 0;

    StringBuffer sb = new StringBuffer();

    while ((read = in.read(bytes)) != -1) {

    sb.append(new String(bytes, 0, read));

    }

    InputStream inputStream = new ByteArrayInputStream(sb.toString().getBytes());

    byte[] re = new byte[1024];

    int haveRead = 0;

    FileOutputStream fileOutputStream = new FileOutputStream(file2);

    StringBuffer sb2 = new StringBuffer();

    while ((haveRead = inputStream.read(re)) != -1) {

    // fileOutputStream.write(re,0,haveRead);

    sb2.append(new String(re, 0, haveRead));

    }

    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "GBK"); // 在这里转换的话会导致都是?

    outputStreamWriter.write(sb2.toString());

    outputStreamWriter.close();

    } catch (FileNotFoundException e1) {

    e1.printStackTrace();

    } catch (IOException e1) {

    e1.printStackTrace();

    } finally {

    }

    }

    public static void test4() throws IOException {

    // File file1 =new File("D:\\disk\\1\\Java锁.txt");

    // File file2 =new File("D:\\disk\\test4.txt");

    // File file1 =new File("D:\\disk\\1\\Unit.wma");

    // File file2 =new File("D:\\disk\\test4.wma");

    File file1 =new File("D:\\disk\\1\\README.doc");

    File file2 =new File("D:\\disk\\test4.doc"); //拷斤棍

    FileInputStream fileInputStream =new FileInputStream(file1);

    Reader reader =new InputStreamReader(fileInputStream,"UTF-8"); // txt测试GBK结果正确 DOC测试以UTF-8测试结果:拷斤棍 //

    char[] chars =new char[1024];

    int read=0;

    StringBuffer sb =new StringBuffer();

    while((read=reader.read(chars))!= -1)

    {

    sb.append(new String(chars,0,read));

    }

    FileOutputStream fileOutputStream =new FileOutputStream(file2);

    Writer writer =new OutputStreamWriter(fileOutputStream,"UTF-8");

    writer.write(sb.toString());

    writer.flush();

    writer.close();

    }

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

    tes();

    test2();

    copy();

    test1();

    test3();

    test4();

    }

    }

    展开全文
  • 我需要做的编辑是:在BLOB内容上方添加标题在每个页面上添加一个水印在每个页面上添加页脚然后,我需要输出文件,而不会在响应中创建任何物理文件。我试图使用itext来实现这一目标,但是并没有达到任何目的。我被困...

    我正在使用Oracle数据库并将PDF内容存储在BLOB字段中。

    我想读取BLOB内容,然后编辑并输出编辑后的内容。

    我需要做的编辑是:

    在BLOB内容

    上方添加标题

    在每个页面上添加一个水印

    在每个页面上添加页脚

    然后,我需要输出文件,而不会在响应流中创建任何物理文件。

    我试图使用itext来实现这一目标,但是并没有达到任何目的。我被困住了,不知道从哪里开始。

    另外有时我可能不得不将blob内容合并为一个,但是多数民众赞成在某件事中一定会发生一次。所以现在不必担心…

    如何在Java中使用上述三个步骤来达到我的主要要求? Itext有可能吗?还是有一些其他的图书馆会有所帮助?

    数据库:Oracle 10g第2版

    操作系统:Linux Fedora/Redhat

    前端:Java/Servlet/JSP

    编辑

    这是我试图做的

    oracle.sql.BLOB blob = (BLOB) rs.getBlob("MYPDF");

    byte[] bytes = blob.getBytes(1, (int) blob.length());

    InputStream is = blob.getBinaryStream();

    Document document=new Document();

    ServletOutputStream servletOutputStream = response.getOutputStream();

    PdfWriter writer=PdfWriter.getInstance(document, servletOutputStream);

    document.open();

    document.add(new Paragraph("Some title"));

    document.add(new Paragraph("Some title"));

    response.setContentType("application/pdf");

    response.setHeader("Content-Disposition", "attachment; filename=output.pdf");

    servletOutputStream.write(bytes, 0, bytes.length);

    servletOutputStream.flush();

    servletOutputStream.close();

    document.close();

    程序在数据库的BLOB字段中输出pdf内容,但不包含标题。

    当我在代码中更改一点(更改最后几行的顺序)为:

    document.close();

    servletOutputStream.flush();

    servletOutputStream.close();

    我得到的文件中包含标题内容,而没有BLOB字段的pdf内容。

    它关闭的第一件事(servletoutputstream/document)被作为输出抛出。

    当我在将Blob内容放入outputstream之前关闭文档时:

    document.close();

    response.setContentType("application/pdf");

    response.setHeader("Content-Disposition", "attachment; filename=output.pdf");

    servletOutputStream.write(bytes, 0, bytes.length);

    servletOutputStream.flush();

    servletOutputStream.close();

    我让浏览器显示如下内容:

    %PDF-1.4 %���� 2 0 obj <>stream x�+�r �26S�00SI�2P�5��1���BҸ4��sSJ2KrR5C��*P�B�5�+��k)&� endstream endobj 4 0 obj <<<>>>/MediaBox[0 0 595 842]>> endobj 1 0 obj <> endobj 3 0 obj <> endobj 5 0 obj <> endobj 6 0 obj <> endobj xref 0 7 0000000000 65535 f 0000000304 00000 n 0000000015 00000 n 0000000392 00000 n 0000000147 00000 n 0000000443 00000 n 0000000488 00000 n trailer > startxref 620 %%EOF

    我需要将文件与pdf内容和标题一起输出。

    希望此编辑对您有所帮助…

    更新(响应标题和BLOB内容而抛出的文件):

    Document document = new Document(PageSize.A4, 108, 72, 30, 72);

    PdfWriter writer = PdfWriter.getInstance(document, outputstream);

    document.open();

    ///-----Added Some Title----///

    rs = stmt.executeQuery(queryToGetBLOBCONTENT);

    if (rs.next()) {

    response.setContentType("application/pdf");

    response.setHeader("Content-Disposition", "attachment; filename=watermark.pdf");

    oracle.sql.BLOB blob = (BLOB) rs.getBlob("MYPDF");

    byte[] bytes = blob.getBytes(1, (int) blob.length());

    InputStream is = blob.getBinaryStream();

    PdfReader pdfReader = new PdfReader(is, bytes);

    BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);

    PdfContentByte cb = writer.getDirectContent(); // Holds the PDF

    PdfImportedPage page;

    int currentPageNumber = 0;

    int pageOfCurrentReaderPDF = 0;

    while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {

    if (pageOfCurrentReaderPDF > 0) {

    document.newPage();

    }

    pageOfCurrentReaderPDF++;

    currentPageNumber++;

    page = writer.getImportedPage(pdfReader, pageOfCurrentReaderPDF);

    cb.addTemplate(page, 0, 0);

    }

    pageOfCurrentReaderPDF = 0;

    outputstream.flush();

    document.close();

    outputstream.close();

    }

    这给了我一个响应文件,该文件的DBBLOB标题在顶部,并且没有生成任何物理文件。

    现在要生成水印,我需要将文档传递给PDfreader,在关闭文档之前我该如何实现这一点(即执行document.close(),当流关闭时,该文件将没有水印)

    我在这段代码中做错了什么?如何在没有水印的情况下创建带有水印的文件?

    最佳答案

    您可以尝试以下方法,而不是直接写入servletOutputStream:

    创建ByteArrayOutputStream的实例

    创建“合并的” PDF文档的实例。 IE。具有标题的PDF形式Blob + PDF。这个例子可能有帮助:http://java-x.blogspot.com/2006/11/merge-pdf-files-with-itext.html

    将合并的PDF写入ByteArrayOutputStream的实例

    设置响应的内容长度

    设置内容类型和内容处置

    从ByteArrayOutputStream获取字节并将这些字节写入servletOutputStream

    关闭ByteArrayOutputStream

    展开全文
  • if(ar[ar.length-1].equals(arr[2]+".pdf")){ pdf = new File(fileName.get(i).toString()); response.setContentLength((int)pdf.length()); FileInputStream input = new FileInputStream(pdf); buf = new ...
  • 在用socket通信传输一个pdf文件以及其他的非txt文件的时候总是传到服务端的文件出错,后来发现是在用字符和字节在读取各种文件上的差别所导致的 java读取文件的方式 字节读取:InputStream和OutPutStream,其...
  • Java读取文件数据

    2017-01-13 00:16:57
    晚上在研习循环结构程序设计[注]的时候,有一节是关于文件操作的。...注:相关PDF下载地址是http://download.csdn.net/detail/peerless_hero/9736266BufferedReaderBufferedReader继承于Reader,它从字符输入中读
  • package com.fzky.diams.web.luncene; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; imp
  • 文件夹) File类声明在java.io包下:文件文件目录路径的抽象表示形式,与平台无关File类中涉及到关于文件文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。...
  • Java (Stream)、⽂件(File)和IOJava (Stream)、⽂件(File)和IOJava.io包⼏乎包含了所有操作输⼊、输出需要的类...输⼊表⽰从⼀个源读取数据,输出表⽰向⼀个⽬标写数据。Java为I/O提供了强⼤的⽽灵活的⽀持...
  • itext-pdfa库创建pdf文件 第三篇: 第一步: 去百度itext-pdfa可以到网上下载该架包 很多时候可以百度的 第二步: // 第一步:创建一个document对象。Document document = new Document(); // 第二步...
  • 按理来说不对啊 读的都是文件流 什么文件不应该都一样 doc pdf什么的不应该一把梭 何况好久没用java了 我就查查查 后来解决方式如下 代码大致如下: FileInputStream input = null; FileOutputStream out = null...
  • java将WORD文档转换成pdf文件

    万次阅读 2007-10-14 11:31:00
    本文试验的是将WORD转换成PDF文件.实现思路一、先将WORD文档转换成HMTL文件格式(参阅我的前一文《JAVA操作WORD文档)。二、用流读取HTML文件。将其保存在一个String对象中。三、用Itext组件,将生成的字符串对象...
  • 一、java 通过字符串生成word文件 POI maven配置 <poi.version>4.1.0</poi.version> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</...
  • 在每个页面上添加页脚然后我需要输出文件,而不会在响应中创建任何物理文件.我尝试使用itext实现这一点,但没有到达任何地方.我被困住了,不知道从哪里开始.有时候我可能不得不将blob内容组合成一个,但...
  • 但我没有pdf路径,我有文件流。请给我一些建议和例子我已经使用ajax显示pdf,正在使用call_method()javascriptajax请求方法来调用showPdf操作,在showpdf操作中,只是将pdf文件转换为ByteArrayOutp...
  • //读取pdf模板 bos = new ByteArrayOutputStream(); stamper = new PdfStamper(reader, bos); AcroFields form = stamper.getAcroFields(); String[] str = {"小证明","110","13666666666","163@qq.com", ...
  • 使用BufferedInputStream和FileInputStream从File指定的文件读取内容; *2.然后建立写入到ByteArrayOutputStream底层输出对象的缓冲输出BufferedOutputStream *3.底层输出流转换成字节数组,...
  • 此外,我将从打印机读取并将其写入PostScript文件.我已经尝试过谷歌下面的示例程序了,但是当我收到PostScript文件时,它是以某种未知的格式.public class PrintToFileWithJava {private st...
  • 一.文件和目录 1.显示文件的基本信息。 2.显示目录的基本信息。 3.在指定目录下创建单个文件。 4.指定目录下创建多个临时文件...6.读取PDF文件中的内容 7.利用poi读取Word文件中的内容。 三、字符 1.追加文件内容 2
  • 最近再搞PDF得展示问题,因为aspose.pdf成本太高,只能使用pdf.js这个开源强大的前端东东了。 在百度了很久后网上大都是node,java,php的事例,有位大哥的是C#的后台代码按他写的前端不生效,最终代码更改如下 ...
  • Java下载网络文件HTTP

    2019-07-17 22:39:47
    HttpURLConnection 读取网络文件 7步 1 创建URL对象 2 获取HttpURLConnection 3 设置Connection属性 4 获取网络文件输入 5 读取流 6 关闭输入 7 关闭Connection String strUrl = ...
  • Pshemo..29不要在这里使用读者和作者,因为它们旨在处理...然后只需从其InputStream中读取并将原始字节写入您的文件.(这是简化的示例,您仍然需要处理异常并确保在正确的位置关闭)System.out.println("opening con...
  • 第四讲 Java 的异常处理和 输入输出 1 课程内容安排 Android JSP和Servlet 应用编程 Java 图形 异常处理与 线程与网络 界面编程 输入输出 Java语言 Java语言 Java面向 概 基础知识 对象编程 课前思考 1....
  • Java2核心技术第7版全两卷.pdf中文高清

    千次下载 热门讨论 2012-09-14 14:22:28
    12.3 zip文件流 12.4 流的使用 12.5 对象流 12.6 文件管理 12.7 新的i/o 第13章 泛型程序设计 13.6 约束与局限性 13.7 泛型类型的继承规则 13.8 通配符类型 13.9 反射和泛型 附录a java关键字 ...
  • 2、 Java Excel 操作excel从Excel文件读取数据表Java Excel API 既可以从本地文件系统的一个文件(.xls),也可以从输入读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术 语:工作薄),下面的代码片段...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 145
精华内容 58
关键字:

java读取pdf文件流

java 订阅