home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Enigma Amiga Life 110
/
EnigmaAmiga110CD.iso
/
indispensabili
/
utility
/
apdf
/
xpdf-0.80
/
xpdf
/
pdfdoc.cc
< prev
next >
Wrap
C/C++ Source or Header
|
1999-06-20
|
4KB
|
172 lines
//========================================================================
//
// PDFDoc.cc
//
// Copyright 1996 Derek B. Noonburg
//
//========================================================================
#ifdef __GNUC__
#pragma implementation
#endif
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include "GString.h"
#include "config.h"
#include "Page.h"
#include "Catalog.h"
#include "XRef.h"
#include "Link.h"
#include "OutputDev.h"
#include "Params.h"
#include "Error.h"
#include "PDFDoc.h"
//------------------------------------------------------------------------
// PDFDoc
//------------------------------------------------------------------------
PDFDoc::PDFDoc(GString *fileName1) {
FileStream *str;
Object catObj;
Object obj;
GString *fileName2;
// setup
ok = gFalse;
catalog = NULL;
xref = NULL;
file = NULL;
links = NULL;
// try to open file
fileName = fileName1;
fileName2 = NULL;
#ifdef VMS
if (!(file = myfopen(fileName->getCString(), "rb", "ctx=stm"))) {
error(-1, "Couldn't open file '%s'", fileName->getCString());
return;
}
#else
if (!(file = myfopen(fileName->getCString(), "rb"))) {
fileName2 = fileName->copy();
fileName2->lowerCase();
if (!(file = myfopen(fileName2->getCString(), "rb"))) {
fileName2->upperCase();
if (!(file = myfopen(fileName2->getCString(), "rb"))) {
error(-1, "Couldn't open file '%s'", fileName->getCString());
delete fileName2;
return;
}
}
delete fileName2;
}
#endif
// create stream
obj.initNull();
str = new FileStream(file, 0, -1, &obj);
//printf("*** check_header\n");
// check header
str->checkHeader();
//printf("*** xref\n");
// read xref table
xref = new XRef(str);
delete str;
if (!xref->isOk()) {
error(-1, "Couldn't read xref table");
return;
}
// read catalog
//printf("*** catalog\n");
catalog = new Catalog(xref->getCatalog(&catObj));
catObj.free();
if (!catalog->isOk()) {
error(-1, "Couldn't read page catalog");
return;
}
//printf("*** done.\n");
// done
ok = gTrue;
return;
}
PDFDoc::~PDFDoc() {
if (catalog)
delete catalog;
if (xref)
delete xref;
if (file)
myfclose(file);
if (fileName)
delete fileName;
if (links)
delete links;
}
void PDFDoc::displayPage(OutputDev *out, int page, int zoom, int rotate,
GBool doLinks) {
Link *link;
double x1, y1, x2, y2;
double w;
int i;
//printf("*** displayPage(%d)\n",page);
if (printCommands)
printf("***** page %d *****\n", page);
catalog->getPage(page)->display(out, zoom, rotate);
if (doLinks) {
if (links)
delete links;
getLinks(page);
for (i = 0; i < links->getNumLinks(); ++i) {
link = links->getLink(i);
link->getBorder(&x1, &y1, &x2, &y2, &w);
if (w > 0)
out->drawLinkBorder(x1, y1, x2, y2, w);
}
out->dump();
}
//printf("*** ...displayPage(%d)\n",page);
}
void PDFDoc::displayPages(OutputDev *out, int firstPage, int lastPage,
int zoom, int rotate) {
Page *p;
int page;
for (page = firstPage; page <= lastPage; ++page) {
if (printCommands)
printf("***** page %d *****\n", page);
p = catalog->getPage(page);
p->display(out, zoom, rotate);
}
}
GBool PDFDoc::saveAs(GString *name) {
FILE *f;
char buf[4096];
int n;
if (!(f = fopen(name->getCString(), "wb"))) {
error(-1, "Couldn't open file '%s'", name->getCString());
return gFalse;
}
myrewind(file);
while ((n = myfread(buf, 1, sizeof(buf), file)) > 0)
fwrite(buf, 1, n, f);
fclose(f);
return gTrue;
}
void PDFDoc::getLinks(int page) {
Object obj;
links = new Links(catalog->getPage(page)->getAnnots(&obj));
obj.free();
}