PDF Viewer / Editor
Printed From: Debenu Quick PDF Library - PDF SDK Community Forum
Category: For Users of the Library
Forum Name: I need help - I can help
Forum Description: Problems and solutions while programming with the Debenu Quick PDF Library and Debenu PDF Viewer SDK
URL: http://www.quickpdf.org/forum/forum_posts.asp?TID=2243
Printed Date: 13 Aug 25 at 5:24PM Software Version: Web Wiz Forums 11.01 - http://www.webwizforums.com
Topic: PDF Viewer / Editor
Posted By: pshay543
Subject: PDF Viewer / Editor
Date Posted: 25 Apr 12 at 1:35AM
Hi, I'm looking for a way to display the PDF in a viewer/editor so the user can make changes. I'm not looking to write a full PDF editor but if it would display the pdf page in a way that the graphics on the page are their own "element" and the end user could click a graphic and remove it from the page or replace it with another graphic. Also, it would be nice if the user could just drag the image around. I really do not care about editing text. I assume with QuickPDF library I can look at each page and read all the attributes for the image (size, position), text with formatting, etc. And place these elements on a Rich View control of some type to accomplish this. I have only used this component to merge and split PDF files. Now I need the ability to add the above mentioned features. Would this be the right approach to do this ? How would forms be handled for filling in information? It would be nice if there was a viewer with QP that allowed this type of stuff. I know I can render the page and then display it as a graphic but I need the elements seperated to be selectable. How are form fields handled when displaying for a user to fill out the information? Any help would be appreciated or if there is a known viewer / editor available that works with Quick PDF I would be interested. Thank you, Paul Shay
|
Replies:
Posted By: Ingo
Date Posted: 25 Apr 12 at 6:30PM
Hi Paul!
In the sample-section there's code for a viewer, too. Try the search function...
Cheers, Ingo
|
Posted By: edvoigt
Date Posted: 25 Apr 12 at 8:52PM
Hi Paul,
the problem is editing. So I say nothing about how to render.
With QP you may build PDFs or modify existing PDFs. But modifying is here only a drawing over. Generally it is very difficult to find out which part inside the PDF is for which visible part on screen. And modifying inside the PDF is no easy game.
So I did a small and dirty study to go another way. The idea is to build a PDF-page over a descriptionlist of objects. If we would have a such list, we could interpret it to build a PDF. If we want to correct something, we change the list and make a fresh PDF.
Because we store for our objects the coordinates, we may calc back (over the used scale for rendering) from mouseposition in image to coordinates and find out, on which object the mouse is pointing.
So we create a baseobject for all entries in our list.
Here is may source, but beware it is only a study, fare from use.
First the objects:
type TMyPaintObj = class(TObject) // the base for all kind of PDF-content private x0, y0, x1, y1: double; // area, in which the object is to paint public procedure SetData(ax0, ay0, ax1, ay1: double); virtual; procedure Paint(QP: TQuickPDF); virtual; // only for inheritance end;
TMyColorObj = class(TMyPaintObj) private C, M, Y, K: double; public procedure SetData(aC, aM, aY, aK: double); override; procedure Paint(QP: TQuickPDF); override; end;
TMyLineObj = class(TMyPaintObj) private public procedure SetData(ax0, ay0, ax1, ay1: double); override; procedure Paint(QP: TQuickPDF); override; end;
TMyBoxObj = class(TMyPaintObj) private public procedure SetData(ax0, ay0, ax1, ay1: double); override; procedure Paint(QP: TQuickPDF); override; end;
TMyCircleObj = class(TMyPaintObj) private r1: double; public procedure SetRadius(ax0, ay0, ar1: double); procedure Paint(QP: TQuickPDF); override; end;
// our list-object, it represents all content TDrawList = class(TObjectList) // items = TMyPaintObj function GetMyPaintObj(aindex: integer): TMyPaintObj; procedure SetMyPaintObj(aindex: integer; const Value: TMyPaintObj); public ItemIndex: integer; property items[aindex: integer]: TMyPaintObj read GetMyPaintObj write SetMyPaintObj; default; constructor Create; virtual; destructor Destroy; override; procedure Paint(QP: TQuickPDF); end;
The implementation looks like this:
procedure TMyPaintObj.SetData(ax0, ay0, ax1, ay1: double); begin x0 := ax0; y0 := ay0; x1 := ax1; y1 := ay1; end;
procedure TMyPaintObj.Paint(QP: TQuickPDF); // only for inheritance begin end;
procedure TMyColorObj.SetData(aC, aM, aY, aK: double); begin C := aC; M := aM; Y := aY; K := aK; end;
procedure TMyColorObj.Paint(QP: TQuickPDF); begin QP.SetLineColorCMYK(C, M, Y, K); end;
procedure TMyLineObj.SetData(ax0, ay0, ax1, ay1: double); begin inherited SetData(ax0, ay0, ax1, ay1); end;
procedure TMyLineObj.Paint(QP: TQuickPDF); begin QP.DrawLine(x0, y0, x1, y1); end;
procedure TMyBoxObj.SetData(ax0, ay0, ax1, ay1: double); begin inherited SetData(ax0, ay0, ax1, ay1); end;
procedure TMyBoxObj.Paint(QP: TQuickPDF); begin QP.DrawBox(x0, y0, x1-x0, y1-y0, 2); end;
procedure TMyCircleObj.SetRadius(ax0, ay0, ar1: double); begin inherited SetData(ax0, ay0, 0, 0); r1 := ar1; end;
procedure TMyCircleObj.Paint(QP: TQuickPDF); begin QP.DrawCircle(x0, y0, r1, 2); end;
// in the same manner you have to construct more objects for fonts and text // and all other things you need
constructor TDrawList.Create; begin inherited Create; ItemIndex := -1; end;
destructor TDrawList.Destroy; begin inherited Destroy; end;
function TDrawList.GetMyPaintObj(aindex: integer): TMyPaintObj; begin if (aindex<0) or (aindex>=count) then Result := nil else Result := inherited Items[aindex] as TMyPaintObj; end;
procedure TDrawList.SetMyPaintObj(aindex: integer; const Value: TMyPaintObj); begin inherited Items[aindex] := Value; end;
// this small code make our list to be a PDF-page procedure TDrawList.Paint(QP: TQuickPDF); var j: integer; begin for j:=0 to Count-1 do Items[j].Paint(QP); // every object paints itself end;
If you did read till here, you know it looks as a lot of work, but it may be a way.
Cheers, Werner
|
Posted By: pshay543
Date Posted: 26 Apr 12 at 1:44PM
Werner, Thank you for sharing the code. I may try to go down this route using your code as an example. Originally I was going to look at purchasing TRichView and ScaleRichview addon and place all the items of the PDF page in the richview / scalerichview component. Manipulate them and then read them off the richview page and place them back into the PDF page. This may work but I am not sure how hard it will be to add the components to the Rich Editor and then get them back in the right position to place on the PDF page. Also, the two components together are $500.00 and I don't want to (and can't afford to) spend that right now. I appreciate you sharing the code and your thoughts on this. I still am not sure how I would handle form fields. I just need to play with the form fields in quick pdf a little more to see how they look in a PDF file and what information can be gained from them to determine positioning, style, etc. Thank you, Paul Shay
|
Posted By: edvoigt
Date Posted: 26 Apr 12 at 2:10PM
Hi Paul,
if you think about something in direction to RTF, so I advise you to a very nice open-source-program. It is made by Marek Jedlinski and named keynote. And there is a work based on it, called keynote-nf, made by Daniel Prado Velasko. The source is hosted at http://code.google.com/p/keynote-nf/ - http://code.google.com/p/keynote-nf/ .
Inside this program works with RTF and images and a lot of other things are allowed too. May be it helps at building the big part outside PDF.
Cheers,
Werner
|
|