Как решить подпись PDF-заголовка не найдена ошибка?
Я использую 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);
}
Ответы
Ответ 1
Вы можете импортировать из пустого источника или недопустимого 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()) );
...
Это должно работать.
Ответ 2
Затем попробуйте сначала переименовать входной файл в .bak и прочитайте .bak и напишите .pdf. Это может дать понять, является ли ошибка при чтении или записи.
Itext - это не один API, а несколько, смешанный. Довольно сложно. Я сделал:
Закройте оба PdfReader
и FileInputStream
.
Закройте оба Document
и PdfWriter
.
Ответ 3
Вы должны использовать PdfCopy
вместо PdfWriter.getInstance
, поскольку в противном случае он не обновляет ссылки на объекты PDF.
Кроме того, вместо добавления Image
к документу вы можете использовать метод PdfCopy.addPage
, который принимает параметр PdfImportedPage
as.
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);
}
}
Ответ 4
В моем случае файл с образцом PDF был поврежден. загрузите новый файл, он будет работать.
Ответ 5
У меня была такая же ошибка, и я просто изменил свой PdfReader на чтение InputStreams для чтения строк. Таким образом, он отлично работает с:
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