Как решить PDF подпись заголовка не найдена ошибка? - PullRequest
13 голосов
/ 28 декабря 2011

Я использую iText в моей java-программе для редактирования существующего PDF-файла. Сгенерированный PDF-файл не может быть открыт, и он показывает ошибку подписи PDF-файла, не найденную. Я использую оба моих входных и выходных файла с одним и тем же именем.

private static String INPUTFILE = "/sample.pdf";
private static String OUTPUTFILE = "/sample.pdf";       
public static void main(String[] args) 
        throws DocumentException,
        IOException 
{
    Document doc = new Document();
    PdfWriter writer = PdfWriter.getInstance(doc,new FileOutputStream(OUTPUTFILE));
    doc.open();
    PdfReader reader = new PdfReader(INPUTFILE);
    int n;
    n = reader.getNumberOfPages();
    System.out.println("No. of Pages :" +n);
    for (int i = 1; i <= n; i++) 
    {
            if (i == 1)                 
            {            
                   Rectangle rect = new Rectangle(85,650,800,833);
                   PdfFormField pushbutton = PdfFormField.createPushButton(writer);
                   pushbutton.setWidget(rect, PdfAnnotation.HIGHLIGHT_PUSH);
                   PdfContentByte cb = writer.getDirectContent();
                   PdfAppearance app = cb.createAppearance(380,201);
                   app.rectangle(62,100,50,-1);
                   app.fill();
                   pushbutton.setAppearance(PdfAnnotation.APPEARANCE_NORMAL,app);
                   writer.addAnnotation(pushbutton);
                   PdfImportedPage page = writer.getImportedPage(reader, i);
                   Image instance = Image.getInstance(page);
                   doc.add(instance);
                }

Ответы [ 5 ]

6 голосов
/ 28 декабря 2011

Затем попробуйте сначала переименовать входной файл в .bak , прочитать .bak и написать .pdf .Это может дать подсказку, является ли ошибка чтением или записью.

Itext - это не один API, а несколько API, смешанных вместе.Довольно сложно иногда.Я сделал:

Закройте оба PdfReader и FileInputStream.

Закройте оба Document и PdfWriter.

5 голосов
/ 19 июня 2012

Возможно, вы импортируете из пустого источника или из неверного файла PDF, в моем случае pdfCopy не работает, поэтому вот код, который я использовал.

Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, OutputStream );
PdfReader reader = new PdfReader(dato.getBinaryStream());

PdfImportedPage page1 = writer.getImportedPage(reader, 1);
PdfContentByte cb = writer.getDirectContent();
cb.addTemplate(page1, 1, 0, 0, 1, 0, 0);

 document.setPageSize(new Rectangle(page1.getWidth(),page1.getHeight()) );

...

Это должно работать.

3 голосов
/ 16 сентября 2016

В моем случае файл примера PDF был поврежден.загрузить новый файл, он будет работать.

3 голосов
/ 23 февраля 2012

Вы должны использовать PdfCopy вместо PdfWriter.getInstance, так как в противном случае не удается обновить ссылки на объекты PDF.

Кроме того, вместо добавления Image к документу вы можете использовать метод PdfCopy.addPage, который принимает PdfImportedPage в качестве параметра.

Document doc = new Document();
PdfCopy writer = new PdfCopy(doc,new FileOutputStream(OUTPUTFILE));
doc.open();
PdfReader reader = new PdfReader(INPUTFILE);
int n = reader.getNumberOfPages();
System.out.println("No. of Pages :" +n);
for (int i = 1; i <= n; i++) {
        if (i == 1) {            
               // removed code for clarity
               PdfImportedPage page = writer.getImportedPage(reader, i);

               writer.addPage(page);
            }
}
2 голосов
/ 05 сентября 2012

У меня была та же ошибка, и я просто изменил свой PdfReader с чтения InputStreams на чтение Strings. Итак, он отлично работает с:

public static void doMerge(List<String> list, OutputStream outputStream)
    throws DocumentException, IOException {
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
document.open();
PdfContentByte cb = writer.getDirectContent();

for (String in : list) {
    PdfReader reader = new PdfReader(in);
    for (int i = 1; i <= reader.getNumberOfPages(); i++) {
        document.newPage();
        // import the page from source pdf
        PdfImportedPage page = writer.getImportedPage(reader, i);
        // add the page to the destination pdf
        cb.addTemplate(page, 0, 0);
    }
}

outputStream.flush();
document.close();
outputStream.close();

}

* Первоначально я взял этот код от http://www.mindfiresolutions.com/Java-Merging-multiple-PDFs-into-a-single-PDF-using-iText-671.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...