├── LICENSE ├── README.md ├── libPDFium ├── libpdfium │ ├── BUILD.gn │ ├── libpdfium.cc │ ├── libpdfium.def │ ├── libpdfium.h │ └── libpdfium.rc ├── out │ └── args.gn └── readme.md ├── printdlg.png ├── screenshot.png └── src ├── DynamicButtons.pas ├── Execute.libPDFium.pas ├── Main.dfm ├── Main.pas ├── PDFium.Frame.dfm ├── PDFium.Frame.pas ├── PDFium.PrintDlg.dfm ├── PDFium.PrintDlg.pas ├── PDFium.SearchDlg.dfm ├── PDFium.SearchDlg.pas ├── PDFiumReader.dpr ├── PDFiumReader.dproj └── PDFiumReader.res /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | {one line to give the program's name and a brief idea of what it does.} 635 | Copyright (C) {year} {name of author} 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | {project} Copyright (C) {year} {fullname} 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PDFiumReader 2 | Sample Delphi PDF reader based on PDFium 3 | 4 | I don't use PDFium.dll anymore, but my own libPDFium.dll library build from the original PDFium source code 5 | 6 | ![screenshot](screenshot.png) 7 | 8 | since June 16, 2020, there's a custom print dialog box 9 | 10 | ![printdlg](printdlg.png) -------------------------------------------------------------------------------- /libPDFium/libpdfium/BUILD.gn: -------------------------------------------------------------------------------- 1 | shared_library("libpdfium") { 2 | cflags = [] 3 | ldflags = [] 4 | sources = [ 5 | "libpdfium.h", 6 | "libpdfium.def", 7 | "libpdfium.cc", 8 | "libpdfium.rc" 9 | ] 10 | defines = [ 11 | "PNG_PREFIX", 12 | "PNG_USE_READ_MACROS", 13 | ] 14 | deps = [ 15 | "../:pdfium", 16 | "//build/win:default_exe_manifest", 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /libPDFium/libpdfium/libpdfium.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include "public/fpdfview.h" 3 | 4 | #include "public/fpdf_annot.h" 5 | #include "public/fpdf_text.h" 6 | #include "public/fpdf_save.h" 7 | #include "public/fpdf_edit.h" 8 | #include "public/fpdf_doc.h" 9 | 10 | #include "libpdfium.h" 11 | 12 | #define IS_REF(i) (i && *i && (*i == &(*(*i))->Reference)) 13 | 14 | //#define TRACE 15 | #ifdef TRACE 16 | #include 17 | DWORD wOut; 18 | #define LOG(s) \ 19 | { \ 20 | AllocConsole(); \ 21 | WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), s, strlen(s), &wOut, 0); \ 22 | } 23 | #define REF(i) \ 24 | if (i == 0 /*|| !*i || (*i != (*i)->Reference)*/) \ 25 | LOG("NULL Interface !!!\n") \ 26 | if (*i == 0) \ 27 | LOG("NULL Reference !!!\n") \ 28 | if (*i != (*i)->Reference) \ 29 | LOG("INVALID Reference\n") \ 30 | if (!(*i)->Handle) \ 31 | LOG("INVALID HANDLE\n") 32 | #else 33 | #define LOG(s) 34 | #define REF(i) 35 | #endif 36 | 37 | // DLL Main 38 | 39 | BOOL APIENTRY DllMain( HMODULE hModule, 40 | DWORD ul_reason_for_call, 41 | LPVOID lpReserved 42 | ) 43 | { 44 | switch (ul_reason_for_call) 45 | { 46 | case DLL_PROCESS_ATTACH: 47 | case DLL_THREAD_ATTACH: 48 | case DLL_THREAD_DETACH: 49 | case DLL_PROCESS_DETACH: 50 | break; 51 | } 52 | return TRUE; 53 | } 54 | 55 | // dummy QueryInterface 56 | 57 | int WINAPI QueryInterface(void *self, void *rrid, void *out) { 58 | LOG("QueryInterface\n") 59 | return 0x80004001; // E_NOTIMPL 60 | } 61 | 62 | // generic function 63 | void WINAPI PDF_FreeHandle(IPDFium pdf) { 64 | // IUnknown->Release, can be used with any object 65 | LOG("FreeHandle\n") 66 | (*pdf)->Release(pdf); 67 | } 68 | 69 | // forward 70 | int WINAPI PDF_Free(IPDFium pdf); 71 | int WINAPI PDFPage_Free(IPDFPage page); 72 | int WINAPI PDFText_Free(IPDFText text); 73 | int WINAPI PDFSearchText_Free(IPDFSearchText search); 74 | 75 | // IPDFBookmark 76 | 77 | int InternalGetBookmark(IPDFium pdf, FPDF_BOOKMARK parent, IPDFBookmark *bookmark); // forward 78 | 79 | int WINAPI PDFBookmark_AddRef(IPDFBookmark bookmark) { 80 | LOG("PDFBookmark_AddRef\n") 81 | REF(bookmark) 82 | return ++(*bookmark)->RefCount; 83 | } 84 | 85 | int WINAPI PDFBookmark_Free(IPDFBookmark bookmark) { 86 | LOG("PDFBookmark_Free\n") 87 | REF(bookmark) 88 | int i =--(*bookmark)->RefCount; 89 | if (i == 0) { 90 | PDF_Free((*bookmark)->PDF); 91 | delete (*bookmark)->Reference; 92 | } 93 | return i; 94 | } 95 | 96 | int WINAPI PDFBookmark_GetPageNumber(IPDFBookmark bookmark) { 97 | LOG("PDFBookmark_GetPageNumber\n") 98 | REF(bookmark) 99 | FPDF_DOCUMENT doc = (*(*bookmark)->PDF)->Handle; 100 | FPDF_DEST dest = FPDFBookmark_GetDest(doc, (*bookmark)->Handle); 101 | if (dest) { 102 | return FPDFDest_GetDestPageIndex(doc, dest); 103 | } 104 | return -1; 105 | } 106 | 107 | int WINAPI PDFBookmark_GetTitle(IPDFBookmark bookmark, PChar title, unsigned long size) { 108 | LOG("PDFBookmark_GetTitle\n") 109 | REF(bookmark) 110 | return FPDFBookmark_GetTitle((*bookmark)->Handle, title, size); 111 | } 112 | 113 | int WINAPI PDFBookmark_GetFirstChild(IPDFBookmark bookmark, IPDFBookmark *child) { 114 | LOG("PDFBookmark_GetFirstChild\n") 115 | return InternalGetBookmark((*bookmark)->PDF, (*bookmark)->Handle, child); 116 | } 117 | 118 | int WINAPI PDFBookmark_GetNext(IPDFBookmark bookmark) { 119 | LOG("PDFBookmark_GetNext\n") 120 | REF(bookmark) 121 | FPDF_DOCUMENT doc = (*(*bookmark)->PDF)->Handle; 122 | FPDF_BOOKMARK next = FPDFBookmark_GetNextSibling(doc, (*bookmark)->Handle); 123 | if (next) { 124 | (*bookmark)->Handle = next; 125 | return 0; 126 | } 127 | return 1; 128 | } 129 | 130 | int InternalGetBookmark(IPDFium pdf, FPDF_BOOKMARK parent, IPDFBookmark *bookmark) { 131 | REF(pdf) 132 | if (IS_REF(bookmark)) 133 | PDFBookmark_Free(*bookmark); 134 | FPDF_BOOKMARK Handle = FPDFBookmark_GetFirstChild((*pdf)->Handle, parent); 135 | if (Handle) { 136 | TPDFBookmark* PDFBookmark = new TPDFBookmark(); 137 | // Internal 138 | (*pdf)->RefCount++; 139 | PDFBookmark->PDF = pdf; 140 | PDFBookmark->Handle = Handle; 141 | PDFBookmark->Reference = PDFBookmark; 142 | PDFBookmark->RefCount = 1; 143 | // IUnknown 144 | PDFBookmark->QueryInterface = QueryInterface; 145 | PDFBookmark->AddRef = PDFBookmark_AddRef; 146 | PDFBookmark->Release = PDFBookmark_Free; 147 | // IPDFBookmark 148 | PDFBookmark->GetPageNumber = PDFBookmark_GetPageNumber; 149 | PDFBookmark->GetTitle = PDFBookmark_GetTitle; 150 | PDFBookmark->GetFirstChild = PDFBookmark_GetFirstChild; 151 | PDFBookmark->GetNext = PDFBookmark_GetNext; 152 | // Result 153 | *bookmark = &PDFBookmark->Reference; 154 | return 0; 155 | } 156 | return 1; 157 | } 158 | 159 | // IPDFAnnotation 160 | 161 | int WINAPI PDFAnnotation_AddRef(IPDFAnnotation annotation) { 162 | LOG("PDFAnnotation_AddRef\n") 163 | REF(annotation) 164 | return ++(*annotation)->RefCount; 165 | } 166 | 167 | int WINAPI PDFAnnotation_Free(IPDFAnnotation annotation) { 168 | LOG("PDFAnnotation_Free\n") 169 | REF(annotation) 170 | int i = --(*annotation)->RefCount; 171 | if (i == 0) { 172 | if ((*annotation)->Handle) 173 | FPDFPage_CloseAnnot((*annotation)->Handle); 174 | PDFPage_Free((*annotation)->Page); 175 | LOG("delete annotation\n") 176 | delete (*annotation)->Reference; 177 | } 178 | return i; 179 | } 180 | 181 | int WINAPI PDFAnnotation_GetSubtype(IPDFAnnotation annotation) { 182 | LOG("PDFAnnotation_GetSubtype\n") 183 | REF(annotation) 184 | return FPDFAnnot_GetSubtype((*annotation)->Handle); 185 | } 186 | 187 | int WINAPI PDFAnnotation_GetRect(IPDFAnnotation annotation, TRectF *rect) { 188 | LOG("PDFAnnotation_GetRect\n") 189 | REF(annotation) 190 | return FPDFAnnot_GetRect((*annotation)->Handle, (FS_LPRECTF)rect); 191 | } 192 | 193 | int WINAPI PDFAnnotation_SetRect(IPDFAnnotation annotation, TRectF *rect) { 194 | LOG("PDFAnnotation_SetRect\n") 195 | REF(annotation) 196 | return FPDFAnnot_SetRect((*annotation)->Handle, (FS_LPRECTF)rect); 197 | } 198 | 199 | int WINAPI PDFAnnotation_GetString(IPDFAnnotation annotation, const PAnsiChar key, PChar str, int size) { 200 | LOG("PDFAnnotation_GetString\n") 201 | REF(annotation) 202 | return FPDFAnnot_GetStringValue((*annotation)->Handle, key, str, size); 203 | } 204 | 205 | int WINAPI PDFAnnotation_Remove(IPDFAnnotation annotation) { 206 | LOG("PDFAnnotation_Remove\n") 207 | REF(annotation) 208 | if (!(*annotation)->Handle) return 0; 209 | FPDFPage_CloseAnnot((*annotation)->Handle); 210 | (*annotation)->Handle = 0; 211 | return FPDFPage_RemoveAnnot((*(*annotation)->Page)->Handle, (*annotation)->Index); 212 | } 213 | 214 | // IPDFSearchText 215 | 216 | int WINAPI PDFSearchText_AddRef(IPDFSearchText search) { 217 | LOG("PDFSearchText_AddRef") 218 | REF(search) 219 | return ++(*search)->RefCount; 220 | } 221 | 222 | int WINAPI PDFSearchText_Free(IPDFSearchText search) { 223 | LOG("PDFSearchText_Free\n") 224 | REF(search) 225 | int i = --(*search)->RefCount; 226 | if (i == 0) { 227 | FPDFText_FindClose((*search)->Handle); 228 | PDFText_Free((*search)->Text); 229 | delete (*search)->Reference; 230 | } 231 | return i; 232 | } 233 | 234 | int WINAPI PDFSearchText_FindNext(IPDFSearchText search) { 235 | LOG("PDFSearchText_FindNext\n") 236 | REF(search) 237 | return FPDFText_FindNext((*search)->Handle); 238 | } 239 | 240 | int WINAPI PDFSearchText_FindPrev(IPDFSearchText search) { 241 | LOG("PDFSearchText_FindPrev\n") 242 | REF(search) 243 | return FPDFText_FindPrev((*search)->Handle); 244 | } 245 | 246 | int WINAPI PDFSearchText_GetPosition(IPDFSearchText search, int *start, int *length) { 247 | LOG("PDFSearchText_GetPosition\n") 248 | REF(search) 249 | *start = FPDFText_GetSchResultIndex((*search)->Handle); 250 | *length = FPDFText_GetSchCount((*search)->Handle); 251 | return 0; 252 | } 253 | 254 | // IPDFText 255 | 256 | int WINAPI PDFText_AddRef(IPDFText text) { 257 | LOG("PDFText_AddRef\n") 258 | REF(text) 259 | return ++(*text)->RefCount; 260 | } 261 | 262 | int WINAPI PDFText_Free(IPDFText text) { 263 | LOG("PDFText_Free\n") 264 | REF(text) 265 | int i = --(*text)->RefCount; 266 | if (i == 0) { 267 | FPDFText_ClosePage((*text)->Handle); 268 | PDFPage_Free((*text)->Page); 269 | LOG("delete text\n") 270 | delete (*text)->Reference; 271 | } 272 | return i; 273 | } 274 | 275 | int WINAPI PDFText_CharCount(IPDFText text) { 276 | REF(text) 277 | return FPDFText_CountChars((*text)->Handle); 278 | } 279 | 280 | int WINAPI PDFText_GetText(IPDFText text, int Start, int Length, PChar Text) { 281 | REF(text) 282 | return FPDFText_GetText((*text)->Handle, Start, Length, Text); 283 | } 284 | 285 | int WINAPI PDFText_CharIndexAtPos(IPDFText text, TPointsSize *size, int distance) { 286 | REF(text) 287 | return FPDFText_GetCharIndexAtPos((*text)->Handle, size->cx, size->cy, distance, distance); 288 | } 289 | 290 | int WINAPI PDFText_GetRectCount(IPDFText text, int Start, int Length) { 291 | REF(text) 292 | return FPDFText_CountRects((*text)->Handle, Start, Length); 293 | } 294 | 295 | int WINAPI PDFText_GetRect(IPDFText text, int Index, TRectD *rect) { 296 | REF(text) 297 | return FPDFText_GetRect((*text)->Handle, Index, &rect->Left, &rect->Top, &rect->Right, &rect->Bottom); 298 | } 299 | 300 | int WINAPI PDFText_Search(IPDFText text, const PChar what, unsigned long flags, int start_index, IPDFSearchText *search) { 301 | LOG("PDFText_Search\n") 302 | REF(text) 303 | if (IS_REF(search)) 304 | PDFSearchText_Free(*search); 305 | FPDF_SCHHANDLE Handle = FPDFText_FindStart((*text)->Handle, (FPDF_WIDESTRING)what, flags, start_index); 306 | if (Handle) { 307 | TPDFSearchText* PDFSearchText = new TPDFSearchText(); 308 | // Internal 309 | (*text)->RefCount++; 310 | PDFSearchText->Text = text; 311 | PDFSearchText->Handle = Handle; 312 | PDFSearchText->Reference = PDFSearchText; 313 | PDFSearchText->RefCount = 1; 314 | // IUnknown 315 | PDFSearchText->QueryInterface = QueryInterface; 316 | PDFSearchText->AddRef = PDFSearchText_AddRef; 317 | PDFSearchText->Release = PDFSearchText_Free; 318 | // IPDFSearchText 319 | PDFSearchText->FindNext = PDFSearchText_FindNext; 320 | PDFSearchText->FindPrev = PDFSearchText_FindPrev; 321 | PDFSearchText->GetPosition = PDFSearchText_GetPosition; 322 | // Result 323 | *search = &PDFSearchText->Reference; 324 | return 1; 325 | } 326 | return 0; 327 | } 328 | 329 | // IPDFBitmap 330 | 331 | int WINAPI PDFBitmap_AddRef(IPDFBitmap bitmap) { 332 | LOG("PDFBitmap_AddRef\n") 333 | REF(bitmap) 334 | return ++(*bitmap)->RefCount; 335 | } 336 | 337 | int WINAPI PDFBitmap_Free(IPDFBitmap bitmap) { 338 | LOG("PDFBitmap_Free\n") 339 | REF(bitmap) 340 | int i = --(*bitmap)->RefCount; 341 | if (i == 0) { 342 | FPDFBitmap_Destroy((*bitmap)->Handle); 343 | delete (*bitmap)->Reference; 344 | } 345 | return i; 346 | } 347 | 348 | int WINAPI PDFBitmap_Draw(IPDFBitmap bitmap, HDC dc, int x, int y) { 349 | LOG("PDFBitmap_Draw\n") 350 | REF(bitmap) 351 | if (!dc) return false; 352 | int w = FPDFBitmap_GetWidth((*bitmap)->Handle); 353 | int h = FPDFBitmap_GetHeight((*bitmap)->Handle); 354 | void* p = FPDFBitmap_GetBuffer((*bitmap)->Handle); 355 | BITMAPINFO bi; 356 | memset(&bi, 0, sizeof(bi)); 357 | bi.bmiHeader.biSize = 40; 358 | bi.bmiHeader.biWidth = w; 359 | bi.bmiHeader.biHeight = -h; 360 | bi.bmiHeader.biPlanes = 1; 361 | bi.bmiHeader.biBitCount = 32; 362 | SetDIBitsToDevice(dc, x, y, w, h, 0, 0, 0, h, p, &bi, 0); 363 | return true; 364 | } 365 | 366 | int WINAPI PDFBitmap_GetInfo(IPDFBitmap bitmap, TPDFBitmapInfo* info) { 367 | LOG("PDFBitmap_GetInfo\n") 368 | REF(bitmap) 369 | if (!info) return false; 370 | info->Format = FPDFBitmap_GetFormat((*bitmap)->Handle); 371 | info->Width = FPDFBitmap_GetWidth((*bitmap)->Handle); 372 | info->Height = FPDFBitmap_GetHeight((*bitmap)->Handle); 373 | info->Stride = FPDFBitmap_GetStride((*bitmap)->Handle); 374 | info->Buffer = FPDFBitmap_GetBuffer((*bitmap)->Handle); 375 | return true; 376 | } 377 | 378 | // IPDFPage 379 | 380 | int WINAPI PDFPage_AddRef(IPDFPage page) { 381 | LOG("PDFPage_AddRef\n") 382 | REF(page) 383 | return ++(*page)->RefCount; 384 | } 385 | 386 | int WINAPI PDFPage_Free(IPDFPage page) { 387 | LOG("PDFPage_Free\n") 388 | REF(page) 389 | int i = --(*page)->RefCount; 390 | if (i == 0) { 391 | FPDF_ClosePage((*page)->Handle); 392 | PDF_Free((*page)->PDF); 393 | LOG("delete page\n") 394 | delete (*page)->Reference; 395 | } 396 | return i; 397 | } 398 | 399 | int WINAPI PDFPage_Render(IPDFPage page, HDC dc, TRect* rect, int rotation, int flags) { 400 | LOG("PDFPage_Render\n") 401 | REF(page) 402 | FPDF_RenderPage(dc, (*page)->Handle, rect->Left, rect->Top, rect->Right - rect->Left, rect->Bottom - rect->Top, rotation, flags); 403 | return 0; 404 | } 405 | 406 | int WINAPI PDFPage_GetAnnotationCount(IPDFPage page) { 407 | LOG("PDFPage_GetAnnotationCount\n") 408 | REF(page) 409 | return FPDFPage_GetAnnotCount((*page)->Handle); 410 | } 411 | 412 | int WINAPI PDFPage_GetAnnotation(IPDFPage page, int annotation_index, IPDFAnnotation *annotation) { 413 | LOG("PDFPage_GetAnnotation\n") 414 | REF(page) 415 | if (IS_REF(annotation)) 416 | PDFAnnotation_Free(*annotation); 417 | FPDF_ANNOTATION Handle = FPDFPage_GetAnnot((*page)->Handle, annotation_index); 418 | if (Handle) { 419 | TPDFAnnotation *PDFAnnotation = new TPDFAnnotation(); 420 | // Internal 421 | (*page)->RefCount++; 422 | PDFAnnotation->Page = page; 423 | PDFAnnotation->Index = annotation_index; 424 | PDFAnnotation->Handle = Handle; 425 | PDFAnnotation->Reference = PDFAnnotation; 426 | PDFAnnotation->RefCount = 1; 427 | // IUnknown 428 | PDFAnnotation->QueryInterface = QueryInterface; 429 | PDFAnnotation->AddRef = PDFAnnotation_AddRef; 430 | PDFAnnotation->Release = PDFAnnotation_Free; 431 | // IPDFAnnotation 432 | PDFAnnotation->GetSubtype = PDFAnnotation_GetSubtype; 433 | PDFAnnotation->GetRect = PDFAnnotation_GetRect; 434 | PDFAnnotation->SetRect = PDFAnnotation_SetRect; 435 | PDFAnnotation->GetString = PDFAnnotation_GetString; 436 | PDFAnnotation->Remove = PDFAnnotation_Remove; 437 | // Result 438 | *annotation = &PDFAnnotation->Reference; 439 | return 0; 440 | } 441 | return 1; 442 | } 443 | 444 | int WINAPI PDFPage_GetText(IPDFPage page, IPDFText *text) { 445 | LOG("PDFPage_GetText\n") 446 | REF(page) 447 | if (IS_REF(text)) 448 | PDFText_Free(*text); 449 | FPDF_TEXTPAGE Handle = FPDFText_LoadPage((*page)->Handle); 450 | if (Handle) { 451 | TPDFText *PDFText = new TPDFText(); 452 | // Internal 453 | (*page)->RefCount++; 454 | PDFText->Page = page; 455 | PDFText->Handle = Handle; 456 | PDFText->Reference = PDFText; 457 | PDFText->RefCount = 1; 458 | // IUnknown 459 | PDFText->QueryInterface = QueryInterface; 460 | PDFText->AddRef = PDFText_AddRef; 461 | PDFText->Release = PDFText_Free; 462 | // IPDFText 463 | PDFText->CharCount = PDFText_CharCount; 464 | PDFText->GetText = PDFText_GetText; 465 | PDFText->CharIndexAtPos = PDFText_CharIndexAtPos; 466 | PDFText->GetRectCount = PDFText_GetRectCount; 467 | PDFText->GetRect = PDFText_GetRect; 468 | PDFText->Search = PDFText_Search; 469 | // Result 470 | *text = &PDFText->Reference; 471 | return 0; 472 | } 473 | return 1; 474 | } 475 | 476 | void WINAPI PDFPage_DeviveToPage(IPDFPage page, TRect *rect, int x, int y, double *px, double *py) { 477 | REF(page) 478 | FPDF_DeviceToPage((*page)->Handle, rect->Left, rect->Top, rect->Right - rect->Left, rect->Bottom - rect->Top, 0, x, y, px, py); 479 | } 480 | 481 | void WINAPI PDFPage_PageToDevice(IPDFPage page, TRect *rect, double px, double py, int *x, int *y) { 482 | REF(page) 483 | FPDF_PageToDevice((*page)->Handle, rect->Left, rect->Top, rect->Right - rect->Left, rect->Bottom - rect->Top, 0, px, py, x, y); 484 | } 485 | 486 | int WINAPI PDFPage_GetRotation(IPDFPage page) { 487 | LOG("PDFPage_GetRotation\n") 488 | REF(page) 489 | return FPDFPage_GetRotation((*page)->Handle); 490 | } 491 | 492 | int WINAPI PDFPage_GetBitmap(IPDFPage page, TRect *pageRect, TRect *viewPort, int rotation, int flags, IPDFBitmap *bitmap) { 493 | LOG("PDFPage_GetBitmap\n") 494 | REF(page) 495 | if IS_REF(bitmap) 496 | PDFBitmap_Free(*bitmap); 497 | int width = viewPort->Right - viewPort->Left; 498 | int height = viewPort->Bottom - viewPort->Top; 499 | FPDF_BITMAP Handle = FPDFBitmap_Create(width, height, 0); 500 | if (!Handle) return false; 501 | 502 | FPDFBitmap_FillRect(Handle, 0, 0, width, height, 0xFFFFFFFF); 503 | int x = pageRect->Left - viewPort->Left; 504 | int y = pageRect->Top - viewPort->Top; 505 | int w = pageRect->Right - pageRect->Left; 506 | int h = pageRect->Bottom - pageRect->Top; 507 | FPDF_RenderPageBitmap(Handle, (*page)->Handle, x, y, w, h, rotation, flags); 508 | 509 | FPDF_DOCUMENT doc = (*(*page)->PDF)->Handle; 510 | FPDF_FORMFILLINFO info; 511 | memset(&info, 0, sizeof(info)); 512 | info.version = 1; 513 | FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(doc, &info); 514 | FPDF_FFLDraw(form, Handle, (*page)->Handle, x, y, w, h, rotation, flags); 515 | FPDFDOC_ExitFormFillEnvironment(form); 516 | 517 | TPDFBitmap* PDFBitmap = new TPDFBitmap(); 518 | // Internal 519 | PDFBitmap->Handle = Handle; 520 | PDFBitmap->Reference = PDFBitmap; 521 | PDFBitmap->RefCount = 1; 522 | // IUnknown 523 | PDFBitmap->QueryInterface = QueryInterface; 524 | PDFBitmap->AddRef = PDFBitmap_AddRef; 525 | PDFBitmap->Release = PDFBitmap_Free; 526 | // IPDFBitmap 527 | PDFBitmap->Draw = PDFBitmap_Draw; 528 | PDFBitmap->GetInfo = PDFBitmap_GetInfo; 529 | // Result 530 | *bitmap = &PDFBitmap->Reference; 531 | return true; 532 | } 533 | 534 | // IPDFium 535 | 536 | int __stdcall PDF_AddRef(IPDFium pdf) { 537 | LOG("PDF_AddRef\n") 538 | REF(pdf) 539 | return ++(*pdf)->RefCount; 540 | } 541 | 542 | int WINAPI PDF_Free(IPDFium pdf) { 543 | LOG("PDF_Free\n") 544 | REF(pdf) 545 | int i = --(*pdf)->RefCount; 546 | if (i == 0) { 547 | LOG("FPDF_CloseDocument\n") 548 | if ((*pdf)->Handle) FPDF_CloseDocument((*pdf)->Handle); 549 | LOG("delete pdf\n") 550 | delete (*pdf)->Reference; 551 | } 552 | return i; 553 | } 554 | 555 | int WINAPI PDF_GetVersion(IPDFium pdf) { 556 | LOG("PDF_GetVersion\n") 557 | REF(pdf) 558 | return (*pdf)->Version; 559 | } 560 | 561 | int WINAPI PDF_GetError(IPDFium pdf) { 562 | LOG("PDF_GetError\n") 563 | REF(pdf) 564 | return (int)FPDF_GetLastError(); 565 | } 566 | 567 | int WINAPI PDF_CloseDocument(IPDFium pdf) { 568 | LOG("PDF_CloseDocument\n") 569 | REF(pdf) 570 | if ((*pdf)->Handle) FPDF_CloseDocument((*pdf)->Handle); 571 | (*pdf)->Handle = 0; 572 | return 0; 573 | } 574 | 575 | int WINAPI PDF_LoadFromFile(IPDFium pdf, PAnsiChar filename, PAnsiChar pwd) { 576 | LOG("PDF_LoadFromFile\n") 577 | REF(pdf) 578 | if ((*pdf)->Handle) FPDF_CloseDocument((*pdf)->Handle); 579 | (*pdf)->Handle = FPDF_LoadDocument(filename, pwd); 580 | return (*pdf)->Handle ? 0 : (int)FPDF_GetLastError(); 581 | } 582 | 583 | int WINAPI PDF_LoadFromMemory(IPDFium pdf, void* data, int size, PAnsiChar pwd) { 584 | LOG("PDF_LoadFromMemory\n") 585 | REF(pdf) 586 | if ((*pdf)->Handle) FPDF_CloseDocument((*pdf)->Handle); 587 | (*pdf)->Handle = FPDF_LoadMemDocument(data, size, pwd); 588 | return (*pdf)->Handle ? 0 : (int)FPDF_GetLastError(); 589 | } 590 | 591 | long WINAPI PDF_GetPermissions(IPDFium pdf) { 592 | REF(pdf) 593 | return FPDF_GetDocPermissions((*pdf)->Handle); 594 | } 595 | 596 | int WINAPI PDF_GetPageCount(IPDFium pdf) { 597 | LOG("PDF_GetPageCount\n") 598 | REF(pdf) 599 | return FPDF_GetPageCount((*pdf)->Handle); 600 | } 601 | 602 | int WINAPI PDF_GetPageSize(IPDFium pdf, int page_index, TPointsSizeF *size) { 603 | LOG("PDF_GetPageSize\n") 604 | REF(pdf) 605 | return FPDF_GetPageSizeByIndexF((*pdf)->Handle, page_index, (FS_SIZEF*)size); 606 | } 607 | 608 | int WINAPI PDF_GetPage(IPDFium pdf, int page_index, IPDFPage* page) { 609 | LOG("PDF_GetPage\n") 610 | REF(pdf) 611 | if (IS_REF(page)) 612 | PDFPage_Free(*page); 613 | FPDF_PAGE Handle = FPDF_LoadPage((*pdf)->Handle, page_index); 614 | if (Handle) { 615 | TPDFPage *PDFPage = new TPDFPage(); 616 | // Internal 617 | (*pdf)->RefCount++; 618 | PDFPage->PDF = pdf; 619 | PDFPage->Handle = Handle; 620 | PDFPage->Reference = PDFPage; 621 | PDFPage->RefCount = 1; 622 | // IUnknown 623 | PDFPage->QueryInterface = QueryInterface; 624 | PDFPage->AddRef = PDFPage_AddRef; 625 | PDFPage->Release = PDFPage_Free; 626 | // IPDFPage 627 | PDFPage->Render = PDFPage_Render; 628 | PDFPage->GetAnnotationCount = PDFPage_GetAnnotationCount; 629 | PDFPage->GetAnnotation = PDFPage_GetAnnotation; 630 | PDFPage->GetText = PDFPage_GetText; 631 | PDFPage->DeviveToPage = PDFPage_DeviveToPage; 632 | PDFPage->PageToDevice = PDFPage_PageToDevice; 633 | PDFPage->GetRotation = PDFPage_GetRotation; 634 | PDFPage->GetBitmap = PDFPage_GetBitmap; 635 | // Result 636 | *page = &PDFPage->Reference; 637 | return 0; 638 | } 639 | return 1; 640 | } 641 | 642 | typedef struct { 643 | FPDF_FILEWRITE FW; 644 | TWriteProc writeProc; 645 | IStream Stream; 646 | } TWriteStream, *PWriteStream; 647 | 648 | int WriteStream(struct FPDF_FILEWRITE_* pThis, const void* pData, unsigned long size) { 649 | ULONG pcbWritten; 650 | if ((*((PWriteStream)pThis)->Stream)->Write(((PWriteStream)pThis)->Stream, pData, size, &pcbWritten) == 0) 651 | return pcbWritten; 652 | return 0; 653 | } 654 | 655 | int WINAPI PDF_SaveToStream(IPDFium pdf, IStream stream) { 656 | LOG("PDF_SaveToStream\n") 657 | REF(pdf) 658 | TWriteStream WS; 659 | WS.FW.version = 1; 660 | WS.FW.WriteBlock = WriteStream; 661 | WS.Stream = stream; 662 | int ret = FPDF_SaveAsCopy((*pdf)->Handle, &WS.FW, 0); 663 | (*stream)->Release(stream); 664 | return ret; 665 | } 666 | 667 | typedef struct { 668 | FPDF_FILEWRITE FW; 669 | TWriteProc writeProc; 670 | void* userData; 671 | } TFileWrite, *PFileWrite; 672 | 673 | int WriteBlock(struct FPDF_FILEWRITE_* pThis, const void* pData, unsigned long size) { 674 | return ((PFileWrite)pThis)->writeProc(pData, size, ((PFileWrite)pThis)->userData); 675 | } 676 | 677 | int WINAPI PDF_SaveToProc(IPDFium pdf, TWriteProc writeProc, void *userData) { 678 | LOG("PDF_SaveToProc\n") 679 | REF(pdf) 680 | TFileWrite FW; 681 | FW.FW.version = 1; 682 | FW.FW.WriteBlock = WriteBlock; 683 | FW.writeProc = writeProc; 684 | FW.userData = userData; 685 | return FPDF_SaveAsCopy((*pdf)->Handle, &FW.FW, 0); 686 | } 687 | 688 | int WINAPI PDF_GetFirstBookmark(IPDFium pdf, IPDFBookmark *bookmark) { 689 | LOG("PDF_GetFirstBookmark\n") 690 | return InternalGetBookmark(pdf, NULL, bookmark); 691 | } 692 | 693 | int WINAPI PDF_GetMetaText(IPDFium pdf, const PAnsiChar name, PChar value, int valueSize) { 694 | LOG("PDF_GetMetaText\n") 695 | REF(pdf) 696 | return FPDF_GetMetaText((*pdf)->Handle, name, value, valueSize); 697 | } 698 | 699 | int initialized = 0; 700 | 701 | int WINAPI PDF_Create(int RequestedVersion, IPDFium* pdf) { 702 | LOG("PDF_Create\n") 703 | if (RequestedVersion != PDFIUM_VERSION) return -1; 704 | if (!initialized) { 705 | LOG("Initialization\n") 706 | initialized = 1; 707 | FPDF_InitLibrary(); 708 | } 709 | if (IS_REF(pdf)) 710 | PDF_Free(*pdf); 711 | TPDFium *PDF = new TPDFium(); 712 | // Internal 713 | PDF->Version = PDFIUM_VERSION; 714 | PDF->Reference = PDF; 715 | PDF->RefCount = 1; 716 | PDF->Handle = 0; 717 | // IUnknown 718 | PDF->QueryInterface = QueryInterface; 719 | PDF->AddRef = PDF_AddRef; 720 | PDF->Release = PDF_Free; 721 | // IPDFInterface 722 | PDF->GetVersion = PDF_GetVersion; 723 | PDF->GetError = PDF_GetError; 724 | PDF->CloseDocument = PDF_CloseDocument; 725 | PDF->LoadFromFile = PDF_LoadFromFile; 726 | PDF->LoadFromMemory = PDF_LoadFromMemory; 727 | PDF->GetPermissions = PDF_GetPermissions; 728 | PDF->GetPageCount = PDF_GetPageCount; 729 | PDF->GetPageSize = PDF_GetPageSize; 730 | PDF->GetPage = PDF_GetPage; 731 | PDF->SaveToStream = PDF_SaveToStream; 732 | PDF->SaveToProc = PDF_SaveToProc; 733 | PDF->GetMetaText = PDF_GetMetaText; 734 | // Result 735 | *pdf = &PDF->Reference; 736 | return 0; 737 | } 738 | -------------------------------------------------------------------------------- /libPDFium/libpdfium/libpdfium.def: -------------------------------------------------------------------------------- 1 | LIBRARY libpdfium.dll 2 | 3 | EXPORTS 4 | PDF_FreeHandle 5 | PDF_Create 6 | PDF_Free 7 | PDF_GetVersion 8 | PDF_GetError 9 | PDF_LoadFromFile 10 | PDF_LoadFromMemory 11 | PDF_GetPermissions 12 | PDF_GetPageCount 13 | PDF_GetPageSize 14 | PDF_GetPage 15 | PDF_SaveToStream 16 | PDF_SaveToProc 17 | PDFPage_Free 18 | PDFPage_Render 19 | PDFPage_GetAnnotationCount 20 | PDFPage_GetAnnotation 21 | PDFPage_GetText 22 | PDFPage_DeviveToPage 23 | PDFPage_PageToDevice 24 | PDFPage_GetRotation 25 | PDFText_Free 26 | PDFText_CharCount 27 | PDFText_GetText 28 | PDFText_CharIndexAtPos 29 | PDFText_GetRectCount 30 | PDFText_GetRect 31 | PDFAnnotation_Free 32 | PDFAnnotation_GetSubtype 33 | PDFAnnotation_GetRect 34 | PDFAnnotation_SetRect 35 | PDFAnnotation_GetString 36 | PDFAnnotation_Remove -------------------------------------------------------------------------------- /libPDFium/libpdfium/libpdfium.h: -------------------------------------------------------------------------------- 1 | // libdfium v1.0.2 (c)2018-2023 Execute SARL 2 | 3 | #ifndef PUBLIC_FPDFVIEW_H_ 4 | typedef void *FPDF_DOCUMENT; 5 | typedef void *FPDF_PAGE; 6 | typedef void *FPDF_TEXTPAGE; 7 | typedef void *FPDF_ANNOTATION; 8 | #endif 9 | #ifndef WINAPI 10 | typedef long ULONG; 11 | typedef int HDC; 12 | #endif 13 | 14 | #define PDFIUM_VERSION 4 15 | 16 | typedef int (__stdcall *TWriteProc)(const void *data, int size, void *UserData); 17 | 18 | typedef char *PAnsiChar; 19 | typedef unsigned short *PChar; 20 | 21 | typedef struct TStream TStream; 22 | typedef TStream *PStream; 23 | typedef TStream **IStream; 24 | 25 | typedef struct TPDFium TPDFium; 26 | typedef TPDFium *PPDFium; 27 | typedef TPDFium **IPDFium; 28 | 29 | typedef struct TPDFPage TPDFPage; 30 | typedef TPDFPage *PPDFPage; 31 | typedef TPDFPage **IPDFPage; 32 | 33 | typedef struct TPDFText TPDFText; 34 | typedef TPDFText *PPDFText; 35 | typedef TPDFText **IPDFText; 36 | 37 | typedef struct TPDFSearchText TPDFSearchText; 38 | typedef TPDFSearchText *PPDFSearchText; 39 | typedef TPDFSearchText **IPDFSearchText; 40 | 41 | typedef struct TPDFAnnotation TPDFAnnotation; 42 | typedef TPDFAnnotation *PPDFAnnotation; 43 | typedef TPDFAnnotation **IPDFAnnotation; 44 | 45 | typedef struct TPDFBookmark TPDFBookmark; 46 | typedef TPDFBookmark *PPDFBookmark; 47 | typedef TPDFBookmark **IPDFBookmark; 48 | 49 | typedef struct TPDFBitmap TPDFBitmap; 50 | typedef TPDFBitmap *PPDFBitmap; 51 | typedef TPDFBitmap **IPDFBitmap; 52 | 53 | typedef struct { 54 | int Format; 55 | int Width; 56 | int Height; 57 | int Stride; 58 | void* Buffer; 59 | } TPDFBitmapInfo; 60 | 61 | typedef struct { 62 | int Left; 63 | int Top; 64 | int Right; 65 | int Bottom; 66 | } TRect; 67 | 68 | typedef struct { 69 | float Left; 70 | float Top; 71 | float Right; 72 | float Bottom; 73 | } TRectF; 74 | 75 | typedef struct { 76 | double Left; 77 | double Top; 78 | double Right; 79 | double Bottom; 80 | } TRectD; 81 | 82 | typedef struct { 83 | double cx; 84 | double cy; 85 | } TPointsSize; 86 | 87 | typedef struct { 88 | float cx; 89 | float cy; 90 | } TPointsSizeF; 91 | 92 | struct TStream { 93 | // IUnknown 94 | int(__stdcall *QueryInterface)(void *intf, void *rrid, void*); 95 | int(__stdcall *AddRef)(IStream stream); 96 | int(__stdcall *Release)(IStream stream); 97 | // ISequentialStream 98 | int(__stdcall *Read)(IStream stream, const void *pv, ULONG cb, ULONG *pcbRead); 99 | int(__stdcall *Write)(IStream stream, const void *pv, ULONG cb, ULONG *pcbWritten); 100 | }; 101 | 102 | struct TPDFBitmap { 103 | // IUnknwon 104 | int(__stdcall *QueryInterface)(void *intf, void *rrid, void*); 105 | int(__stdcall *AddRef)(IPDFBitmap bitmap); 106 | int(__stdcall *Release)(IPDFBitmap bitmap); 107 | // IDPFBitmap 108 | int(__stdcall *Draw)(IPDFBitmap bitmap, HDC dc, int x, int y); 109 | int(__stdcall *GetInfo)(IPDFBitmap bitmap, TPDFBitmapInfo* info); 110 | // Internal 111 | PPDFBitmap Reference; 112 | int RefCount; 113 | FPDF_BITMAP Handle; 114 | }; 115 | 116 | struct TPDFBookmark { 117 | // IUnknwon 118 | int(__stdcall *QueryInterface)(void *intf, void *rrid, void*); 119 | int(__stdcall *AddRef)(IPDFBookmark bookmark); 120 | int(__stdcall *Release)(IPDFBookmark bookmark); 121 | // IPDFBookmark 122 | int(__stdcall *GetPageNumber)(IPDFBookmark bookmark); 123 | int(__stdcall *GetTitle)(IPDFBookmark bookmark, PChar title, unsigned long size); 124 | int(__stdcall *GetFirstChild)(IPDFBookmark bookmark, IPDFBookmark *child); 125 | int(__stdcall *GetNext)(IPDFBookmark bookmark); 126 | // Internal 127 | PPDFBookmark Reference; 128 | int RefCount; 129 | IPDFium PDF; 130 | FPDF_BOOKMARK Handle; 131 | }; 132 | 133 | struct TPDFAnnotation { 134 | // IUnknown 135 | int(__stdcall *QueryInterface)(void *intf, void *rrid, void*); 136 | int(__stdcall *AddRef)(IPDFAnnotation annotation); 137 | int(__stdcall *Release)(IPDFAnnotation annotation); 138 | // IPDFAnnotation 139 | int(__stdcall *GetSubtype)(IPDFAnnotation annotation); 140 | int(__stdcall *GetRect)(IPDFAnnotation annotation, TRectF *rect); 141 | int(__stdcall *SetRect)(IPDFAnnotation annotation, TRectF *rect); 142 | int(__stdcall *GetString)(IPDFAnnotation annotation, const PAnsiChar key, PChar str, int size); 143 | int(__stdcall *Remove)(IPDFAnnotation annotation); 144 | // Internal 145 | PPDFAnnotation Reference; 146 | int RefCount; 147 | IPDFPage Page; 148 | int Index; 149 | FPDF_ANNOTATION Handle; 150 | }; 151 | 152 | struct TPDFSearchText { 153 | // IUnknown 154 | int(__stdcall *QueryInterface)(void *intf, void *rrid, void *out); 155 | int(__stdcall *AddRef)(IPDFSearchText search); 156 | int(__stdcall *Release)(IPDFSearchText search); 157 | // IPDFSearchText 158 | int(__stdcall *FindNext)(IPDFSearchText search); 159 | int(__stdcall *FindPrev)(IPDFSearchText search); 160 | int(__stdcall *GetPosition)(IPDFSearchText search, int *Start, int *Length); 161 | // Internal 162 | PPDFSearchText Reference; 163 | int RefCount; 164 | IPDFText Text; 165 | FPDF_SCHHANDLE Handle; 166 | }; 167 | 168 | struct TPDFText { 169 | // IUnknown 170 | int(__stdcall *QueryInterface)(void *intf, void *rrid, void *out); 171 | int(__stdcall *AddRef)(IPDFText text); 172 | int(__stdcall *Release)(IPDFText text); 173 | // IPDFText 174 | int(__stdcall *CharCount)(IPDFText text); 175 | int(__stdcall *GetText)(IPDFText text, int Start, int Length, PChar Text); 176 | int(__stdcall *CharIndexAtPos)(IPDFText text, TPointsSize *size, int distance); 177 | int(__stdcall *GetRectCount)(IPDFText text, int Start, int Length); 178 | int(__stdcall *GetRect)(IPDFText text, int Index, TRectD *rect); 179 | int(__stdcall *Search)(IPDFText text, const PChar what, unsigned long flags, int start_index, IPDFSearchText *search); 180 | // Internal 181 | PPDFText Reference; 182 | int RefCount; 183 | IPDFPage Page; 184 | FPDF_TEXTPAGE Handle; 185 | }; 186 | 187 | struct TPDFPage { 188 | // IUnknown 189 | int(__stdcall *QueryInterface)(void *intf, void *rrid, void *out); 190 | int(__stdcall *AddRef)(IPDFPage page); 191 | int(__stdcall *Release)(IPDFPage page); 192 | // IPDFPage 193 | int(__stdcall *Render)(IPDFPage page, HDC dc, TRect *rect, int rotation, int flags); 194 | int(__stdcall *GetAnnotationCount)(IPDFPage page); 195 | int(__stdcall *GetAnnotation)(IPDFPage page, int annotation_index, IPDFAnnotation *annotation); 196 | int(__stdcall *GetText)(IPDFPage page, IPDFText *text); 197 | void(__stdcall *DeviveToPage)(IPDFPage page, TRect *rect, int x, int y, double *px, double *py); 198 | void(__stdcall *PageToDevice)(IPDFPage page, TRect *rect, double px, double py, int *x, int *y); 199 | int(__stdcall *GetRotation)(IPDFPage page); 200 | int(__stdcall *GetBitmap)(IPDFPage page, TRect *pageRect, TRect *viewPort, int rotation, int flags, IPDFBitmap* bitmap); 201 | // Internal 202 | PPDFPage Reference; 203 | int RefCount; 204 | IPDFium PDF; 205 | FPDF_PAGE Handle; 206 | }; 207 | 208 | struct TPDFium { 209 | // IUnknown 210 | int(__stdcall *QueryInterface)(void *intf, void *rrid, void *out); 211 | int(__stdcall *AddRef)(IPDFium pdf); 212 | int(__stdcall *Release)(IPDFium pdf); 213 | // IPDFium 214 | int(__stdcall *GetVersion)(IPDFium pdf); 215 | int(__stdcall *GetError)(IPDFium pdf); 216 | int(__stdcall *CloseDocument)(IPDFium pdf); 217 | int(__stdcall *LoadFromFile)(IPDFium pdf, PAnsiChar filename, PAnsiChar pwd); 218 | int(__stdcall *LoadFromMemory)(IPDFium pdf, void *data, int size, PAnsiChar pwd); 219 | long(__stdcall *GetPermissions)(IPDFium pdf); 220 | int(__stdcall *GetPageCount)(IPDFium pdf); 221 | int(__stdcall *GetPageSize)(IPDFium pdf, int page_index, TPointsSizeF *size); 222 | int(__stdcall *GetPage)(IPDFium pdf, int page_index, IPDFPage *page); 223 | int(__stdcall *SaveToStream)(IPDFium pdf, IStream stream); 224 | int(__stdcall *SaveToProc)(IPDFium pdf, TWriteProc writeProc, void *userData); 225 | int(__stdcall *GetFirstBookmark)(IPDFium pdf, IPDFBookmark *bookmark); 226 | int(__stdcall *GetMetaText)(IPDFium pdf, const PAnsiChar name, PChar value, int valueSize); 227 | // Internal 228 | PPDFium Reference; 229 | int RefCount; 230 | int PageCount; 231 | int Version; 232 | FPDF_DOCUMENT Handle; 233 | }; 234 | 235 | int __stdcall PDF_FreeHandle(void *handle); 236 | 237 | int __stdcall PDF_Create(int RequiredVersion, IPDFium *pdf); 238 | int __stdcall PDF_Free(IPDFium pdf); 239 | int __stdcall PDF_GetVersion(IPDFium pdf); 240 | int __stdcall PDF_GetError(IPDFium pdf); 241 | int __stdcall PDF_CloseDocument(IPDFium pdf); 242 | int __stdcall PDF_LoadFromFile(IPDFium pdf, char *filename, char *pwd); 243 | int __stdcall PDF_LoadFromMemory(IPDFium pdf, void *data, int size, char *pwd); 244 | long __stdcall PDF_GetPermissions(IPDFium pdf); 245 | int __stdcall PDF_GetPageCount(IPDFium pdf); 246 | int __stdcall PDF_GetPageSize(IPDFium pdf, int page_index, double *width, double *height); 247 | int __stdcall PDF_GetPage(IPDFium pdf, int page_index, IPDFPage *page); 248 | int __stdcall PDF_SaveToStream(IPDFium pdf, IStream stream); 249 | int __stdcall PDF_SaveToProc(IPDFium pdf, TWriteProc writeProc, void *userData); 250 | 251 | int __stdcall PDFPage_Free(IPDFPage page); 252 | int __stdcall PDFPage_Render(IPDFPage page, HDC dc, TRect *rect, int rotation, int flags); 253 | int __stdcall PDFPage_Paint(IPDFPage page, HDC dc, TRect *rect, int annotation); 254 | int __stdcall PDFPage_GetAnnotationCount(IPDFPage page); 255 | int __stdcall PDFPage_GetAnnotation(IPDFPage page, int annotation_index, IPDFAnnotation *annotation); 256 | int __stdcall PDFPage_GetText(IPDFPage page, IPDFText *text); 257 | void __stdcall PDFPage_DeviveToPage(IPDFPage page, TRect *rect, int x, int y, double *px, double *py); 258 | void __stdcall PDFPage_PageToDevice(IPDFPage page, TRect *rect, double px, double py, int *x, int *y); 259 | int __stdcall PDFPage_GetRotation(IPDFPage page); 260 | 261 | int __stdcall PDFText_Free(IPDFText text); 262 | int __stdcall PDFText_CharCount(IPDFText text); 263 | int __stdcall PDFText_GetText(IPDFText text, int Start, int Length, unsigned short *Text); 264 | int __stdcall PDFText_CharIndexAtPos(IPDFText text, TPointsSize *size, int distance); 265 | int __stdcall PDFText_GetRectCount(IPDFText text, int Start, int Length); 266 | int __stdcall PDFText_GetRect(IPDFText text, int Index, TRectD *rect); 267 | 268 | int __stdcall PDFAnnotation_Free(IPDFAnnotation annotation); 269 | int __stdcall PDFAnnotation_GetSubtype(IPDFAnnotation annotation); 270 | int __stdcall PDFAnnotation_GetRect(IPDFAnnotation annotation, TRectF *rect); 271 | int __stdcall PDFAnnotation_SetRect(IPDFAnnotation annotation, TRectF *rect); 272 | int __stdcall PDFAnnotation_GetString(IPDFAnnotation annotation, char *key, char *str, int size); 273 | -------------------------------------------------------------------------------- /libPDFium/libpdfium/libpdfium.rc: -------------------------------------------------------------------------------- 1 | 1 VERSIONINFO 2 | FILEVERSION 2023,3,26,2269 3 | PRODUCTVERSION 1,0,3,0 4 | FILETYPE 1 { 5 | BLOCK "StringFileInfo" 6 | { 7 | BLOCK "040C04E4" 8 | { 9 | VALUE "CompanyName", "Execute SARL\0" 10 | VALUE "FileDescription", "libPDFium a COM wrapper for Google's PDFium\0" 11 | VALUE "FileVersion", "2023.3.26.2269\0" 12 | VALUE "LegalCopyright", "(c)2018-2023 Execute SARL. All Rights Reserved\0" 13 | VALUE "OriginalFilename", "libPDFium.dll\0" 14 | VALUE "ProductName", "libPDFium\0" 15 | VALUE "ProductVersion", "1.0.3.0\0" 16 | } 17 | } 18 | BLOCK "VarFileInfo" 19 | { 20 | VALUE "Translation", 0x40C, 0x04E4 21 | } 22 | } -------------------------------------------------------------------------------- /libPDFium/out/args.gn: -------------------------------------------------------------------------------- 1 | # Build arguments go here. 2 | # See "gn args --list" for available build arguments. 3 | 4 | is_official_build = true 5 | chrome_pgo_phase=0 6 | is_debug = false 7 | symbol_level = 0 8 | 9 | # is_official_build = false 10 | # is_debug = true 11 | 12 | pdf_is_standalone = true 13 | pdf_enable_xfa = false 14 | pdf_enable_v8 = false 15 | is_component_build = false 16 | 17 | # default x64 18 | target_cpu = "x86" -------------------------------------------------------------------------------- /libPDFium/readme.md: -------------------------------------------------------------------------------- 1 | # libPDFium (c)2018-2023 Execute SARL 2 | 3 | A PDFium Library designed for Delphi, by a Delphi developper. 4 | 5 | it's a x86/x64 Windows library that can be used by any langage afterall 6 | 7 | to get a IPDFium object, just call 8 | ``` 9 | IPDFium pdf = 0; 10 | PDF_Create(1, &pdf) 11 | ``` 12 | all the COM methods are exposed as a raw C API, so you can call 13 | ``` 14 | (*pdf)->LoadFromFile("file.pdf", NULL); 15 | (*pdf)->Release(); 16 | ``` 17 | or 18 | ``` 19 | PDF_LoadFromFile(pdf, "file.pdf", NULL); 20 | PDF_Free(pdf); 21 | ``` 22 | 23 | I'm not a C developper, if you need a libpdfium.lib, sorry you'll have to do it yourself, or switch to Delphi and use Execute.libPDFium.pas :) 24 | 25 | I know, libpdfium.h exposes the internal members of my objects, but it's not my purpose to use this library from a C project, only from a Delphi one, so I don't care. 26 | 27 | I've found how to install rc.exe so I can compile libpdfium.rc ! 28 | ```` 29 | third_party/depot_tools/download_from_google_storage.bat -s build/toolchain/win/rc/win/rc.exe.sha1 --bucket chromium-browser-clang/rc 30 | ```` 31 | 32 | ## Requirements to recompile libPDFium 33 | install [depot_tools](https://www.chromium.org/developers/how-tos/depottools) 34 | ```` 35 | set path=%path%; 36 | set DEPOT_TOOLS_WIN_TOOLCHAIN=0 37 | set GCLIENT_PY3=0 38 | ```` 39 | download PDFium source code 40 | ```` 41 | md git 42 | cd git 43 | gclient config --unmanaged https://pdfium.googlesource.com/pdfium.git 44 | gclient sync 45 | ```` 46 | install libPDFium 47 | 1. copy libpdfium/* files to pdfium/libpdfium/* 48 | 2. edit Google's pdfium/BUILD.gn to add libpdfium 49 |
50 | ...
51 | group("pdfium_all") {
52 |   testonly = true
53 |   deps = [
54 |     ":pdfium_diff",
55 |     ":pdfium_embeddertests",
56 |     ":pdfium_unittests",
57 |     "//libpdfium:libpdfium",
58 |   ]
59 |   if (pdf_is_standalone) {
60 |     deps += [
61 |       ":fuzzers",
62 |       ":samples",
63 |     ]
64 |   }
65 | }
66 | 
67 | ## Recompile libPDFium 68 | ```` 69 | cd pdfium 70 | gn gen out --ide=vs 71 | ```` 72 | copy "out/args.gn" into "pdfium/out/args.gn" 73 | 74 | you can change options in args.gn (debug/release, x86/x64), then 75 | 76 | ```` 77 | gn gen out --ide=vs 78 | ninja -C out libpdfium 79 | ```` 80 | 81 | Take a coffee or two and you should find libPDFium.dll in the pdfium/out directory. -------------------------------------------------------------------------------- /printdlg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tothpaul/PDFiumReader/e6d9c08d6a187cc38bf5908a29cd8a49e22232b3/printdlg.png -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tothpaul/PDFiumReader/e6d9c08d6a187cc38bf5908a29cd8a49e22232b3/screenshot.png -------------------------------------------------------------------------------- /src/DynamicButtons.pas: -------------------------------------------------------------------------------- 1 | unit DynamicButtons; 2 | 3 | interface 4 | 5 | uses 6 | System.Types, 7 | System.UITypes, 8 | Vcl.Graphics; 9 | 10 | type 11 | TCanvasHelper = class helper for TCanvas 12 | procedure Folder(x: Integer); 13 | procedure Circle(x, y, w, h: Integer); 14 | procedure Minus(x: Integer); 15 | procedure Plus(x: Integer); 16 | procedure Paper(x, y, w, c: Integer); 17 | procedure Continus(x: Integer); 18 | procedure FixContinus(x: Integer); 19 | procedure FullPage(x: Integer); 20 | procedure FixFullPage(x: Integer); 21 | procedure ActualSize(x: Integer); 22 | procedure FixActualSize(x: Integer); 23 | procedure One(x, y: Integer); 24 | procedure About(x: Integer); 25 | procedure DrawButtons(x: Integer; Color: TColor); 26 | procedure FixButtons(x: Integer; Color: TColor); 27 | procedure Arrow(x, y: Integer); 28 | procedure Pipe(x: Integer); 29 | procedure Prev(x: Integer); 30 | procedure Next(x: Integer); 31 | procedure Print(x: Integer); 32 | procedure FixPrint(x: Integer); 33 | end; 34 | 35 | procedure AntiAliaze(Bmp: TBitmap); 36 | 37 | implementation 38 | 39 | 40 | function Merge(c1, c2, c3, c4: Cardinal): Cardinal; 41 | var 42 | r, g, b, a: Cardinal; 43 | begin 44 | a := (c1 shr 24) and $ff + (c2 shr 24) and $ff + (c3 shr 24) and $ff + (c4 shr 24) and $ff; 45 | r := (c1 shr 16) and $ff + (c2 shr 16) and $ff + (c3 shr 16) and $ff + (c4 shr 16) and $ff; 46 | g := (c1 shr 8) and $ff + (c2 shr 8) and $ff + (c3 shr 8) and $ff + (c4 shr 8) and $ff; 47 | b := (c1 ) and $ff + (c2 ) and $ff + (c3 ) and $ff + (c4 ) and $ff; 48 | Result := (a shr 2) shl 24 49 | + (r shr 2) shl 16 50 | + (g shr 2) shl 8 51 | + (b shr 2); 52 | end; 53 | 54 | procedure AntiAliaze(Bmp: TBitmap); 55 | type 56 | TPair = record 57 | c1, c2 : Cardinal; 58 | end; 59 | var 60 | w,h:Integer; 61 | x,y: Integer; 62 | p1 : PCardinal; 63 | p2 : ^TPair; 64 | p3 : ^TPair; 65 | begin 66 | w := Bmp.Width div 2; 67 | h := Bmp.Height div 2; 68 | for y := 0 to h - 1 do 69 | begin 70 | p1 := Bmp.ScanLine[y]; 71 | p2 := Bmp.ScanLine[2 * y]; 72 | p3 := Bmp.ScanLine[2 * y + 1]; 73 | for x:= 0 to w - 1 do 74 | begin 75 | p1^ := Merge(p2.c1, p2.c2, p3.c1, p3.c2); 76 | Inc(p1); 77 | Inc(p2); 78 | Inc(p3); 79 | end; 80 | end; 81 | Bmp.SetSize(w, h); 82 | end; 83 | 84 | procedure TCanvasHelper.FixActualSize(x: Integer); 85 | begin 86 | Pixels[x + 12, 14] := Pen.Color; 87 | Pixels[x + 12, 16] := Pen.Color; 88 | end; 89 | 90 | procedure TCanvasHelper.FixButtons(x: Integer; Color: TColor); 91 | begin 92 | Pen.Color := Color; 93 | FixContinus(6 * 24 + x); 94 | FixFullPage(8 * 24 + x); 95 | FixActualSize(10 * 24 + x); 96 | FixPrint(18 * 24 + x); 97 | end; 98 | 99 | procedure TCanvasHelper.FixContinus(x: Integer); 100 | var 101 | p: array[0..2] of TPoint; 102 | begin 103 | Inc(x, 12); 104 | p[0].x := x - 5; 105 | p[0].y := 21; 106 | p[1].x := x - 3; 107 | p[1].y := 21 - 2; 108 | p[2].x := x - 3; 109 | p[2].y := 21 + 2; 110 | Polygon(p); 111 | p[0].x := x + 5; 112 | p[1].x := x + 3; 113 | p[2].x := x + 3; 114 | Polygon(p); 115 | MoveTo(x - 5, 21); 116 | LineTo(x + 5, 21); 117 | end; 118 | 119 | procedure TCanvasHelper.FixFullPage(x: Integer); 120 | var 121 | p: array[0..2] of TPoint; 122 | begin 123 | Brush.Color := Pen.Color; 124 | Inc(x, 12); 125 | p[0].x := x - 6; 126 | p[0].y := 12; 127 | p[1].x := x - 4; 128 | p[1].y := 12 - 2; 129 | p[2].x := x - 4; 130 | p[2].y := 12 + 2; 131 | Polygon(p); 132 | p[0].x := x + 6; 133 | p[1].x := x + 4; 134 | p[2].x := x + 4; 135 | Polygon(p); 136 | p[0].x := x; 137 | p[0].y := 6; 138 | p[1].x := x - 2; 139 | p[1].y := 8; 140 | p[2].x := x + 2; 141 | p[2].y := 8; 142 | Polygon(p); 143 | p[0].y := 18; 144 | p[1].y := 16; 145 | p[2].y := 16; 146 | Polygon(p); 147 | MoveTo(x - 5, 12); 148 | LineTo(x - 1, 12); 149 | MoveTo(x + 2, 12); 150 | LineTo(x + 5, 12); 151 | MoveTo(x, 9); 152 | LineTo(x, 12); 153 | MoveTo(x, 13); 154 | LineTo(x, 16); 155 | end; 156 | 157 | procedure TCanvasHelper.FixPrint(x: Integer); 158 | begin 159 | MoveTo(x + 7, 17); 160 | LineTo(x + 15, 17); 161 | MoveTo(x + 7, 19); 162 | LineTo(x + 15, 19); 163 | end; 164 | 165 | procedure TCanvasHelper.Folder(x: Integer); 166 | var 167 | p: array[0..7] of TPoint; 168 | c: Cardinal; 169 | r: array [0..3] of Byte absolute c; 170 | begin 171 | Brush.Color := $FAFAFA; 172 | p[0].x := x + 46; p[0].y := 20; 173 | p[1].x := x + 34; p[1].y := 42; 174 | p[2].x := x + 2; p[2].y := 42; 175 | p[3].x := x + 2; p[3].y := 8; 176 | p[4].x := x + 18; p[4].y := 8; 177 | p[5].x := x + 18; p[5].y := 14; 178 | p[6].x := x + 40; p[6].y := 14; 179 | p[7].x := x + 40; p[7].y := 20; 180 | Polygon(p); 181 | Brush.Color := $DEDEDE; 182 | p[3].x := x + 16; p[3].y := 20; 183 | Polygon(Slice(p, 4)); 184 | Brush.Color := clWhite; 185 | end; 186 | 187 | procedure TCanvasHelper.About(x: Integer); 188 | begin 189 | Circle(x + 3, 3, 42, 42); 190 | Font.Size := 20; 191 | Font.Color := Pen.Color; 192 | Font.Style := [fsBold]; 193 | TextOut(x + 17, 7, '?'); 194 | end; 195 | 196 | procedure TCanvasHelper.ActualSize(x: Integer); 197 | begin 198 | Paper(x + 10, 4, 32, 10); 199 | One(x + 20, 22); 200 | One(x + 32, 22); 201 | end; 202 | 203 | procedure TCanvasHelper.One(x, y: Integer); 204 | begin 205 | MoveTo(x - 2, y + 2); 206 | LineTo(x, y); 207 | LineTo(x, y + 14); 208 | end; 209 | 210 | procedure TCanvasHelper.Arrow(x, y: Integer); 211 | var 212 | p: array[0..2] of TPoint; 213 | begin 214 | p[0].x := x - 3; 215 | p[0].y := y; 216 | p[1].x := x + 3; 217 | p[1].y := y; 218 | p[2].x := x; 219 | p[2].y := y + 3; 220 | Polygon(p); 221 | end; 222 | 223 | procedure TCanvasHelper.Circle(x, y, w, h: Integer); 224 | begin 225 | Ellipse(x, y, x + w, y + h); 226 | end; 227 | 228 | procedure TCanvasHelper.Continus(x: Integer); 229 | begin 230 | Brush.Color := clWhite; 231 | // Rectangle(x + 10, -2, x + 41, 13); 232 | Paper(x + 10, -28, 30, 12); 233 | Paper(x + 10, +20, 30, 12); 234 | end; 235 | 236 | procedure TCanvasHelper.Minus(x: Integer); 237 | begin 238 | Circle(x + 3, 3, 42, 42); 239 | Pixels[x + 23, 1] := clBtnFace; 240 | MoveTo(x + 14, 24); 241 | LineTo(x + 34, 24); 242 | end; 243 | 244 | procedure TCanvasHelper.Next(x: Integer); 245 | begin 246 | Pipe(x); 247 | MoveTo(x + 24 - 8, 34 - 8); 248 | LineTo(x + 24, 34); 249 | LineTo(x + 24 + 8, 34 - 8); 250 | end; 251 | 252 | procedure TCanvasHelper.FullPage(x: Integer); 253 | begin 254 | Paper(x + 10, 4, 32, 10); 255 | end; 256 | 257 | procedure TCanvasHelper.Paper(x, y, w, c: Integer); 258 | var 259 | p: array[0..4] of TPoint; 260 | begin 261 | p[0].X := x + w - c; 262 | p[0].Y := y; 263 | p[1].X := x + w; 264 | p[1].Y := y + c; 265 | p[2].X := x + w; 266 | p[2].Y := y + 40; 267 | p[3].X := x; 268 | p[3].Y := y + 40; 269 | p[4].X := x; 270 | p[4].Y := y; 271 | Polygon(p); 272 | p[2].X := x + w - c; 273 | p[2].Y := y + c; 274 | Polygon(Slice(p, 3)); 275 | end; 276 | 277 | procedure TCanvasHelper.Pipe(x: Integer); 278 | begin 279 | Circle(x + 3, 3, 42, 42); 280 | MoveTo(x + 24, 14); 281 | LineTo(x + 24, 34); 282 | end; 283 | 284 | procedure TCanvasHelper.Plus(x: Integer); 285 | begin 286 | Minus(x); 287 | MoveTo(x + 24, 14); 288 | LineTo(x + 24, 34); 289 | end; 290 | 291 | procedure TCanvasHelper.Prev(x: Integer); 292 | begin 293 | Pipe(x); 294 | MoveTo(x + 24 - 8, 14 + 8); 295 | LineTo(x + 24, 14); 296 | LineTo(x + 24 + 8, 14 + 8); 297 | end; 298 | 299 | procedure TCanvasHelper.Print(x: Integer); 300 | begin 301 | Rectangle(x + 8, 6, x + 37, 47); 302 | Brush.Color := Pen.Color; 303 | Rectangle(x + 4, 20, x + 41, 30); 304 | Rectangle(x + 4, 18, x + 8, 35); 305 | Rectangle(x + 37, 18, x + 41, 35); 306 | end; 307 | 308 | procedure TCanvasHelper.DrawButtons(x: Integer; Color: TColor); 309 | begin 310 | Pen.Color := Color; 311 | Folder(0 * 48 + x); 312 | Minus(2 * 48 + x); 313 | Plus(4 * 48 + x); 314 | Continus(6 * 48 + x); 315 | FullPage(8 * 48 + x); 316 | ActualSize(10 * 48 + x); 317 | About(12 * 48 + x); 318 | Prev(14 * 48 + x); 319 | Next(16 * 48 + x); 320 | Print(18 * 48 + x); 321 | end; 322 | 323 | end. 324 | -------------------------------------------------------------------------------- /src/Execute.libPDFium.pas: -------------------------------------------------------------------------------- 1 | unit Execute.libPDFium; 2 | 3 | { 4 | libPDFium.dll (c)2017-2023 by Execute SARL 5 | http://www.execute.fr 6 | https://github.com/tothpaul/PDFiumReader 7 | 8 | 9 | v26.03.2023 - update the PDFIUM source code (23.03.2023 23:09:01) 10 | - LoadFromFile use now an UTF8 FileName 11 | 12 | } 13 | {$WARN SYMBOL_PLATFORM OFF} 14 | 15 | interface 16 | 17 | uses 18 | Winapi.Windows, 19 | Winapi.ActiveX, 20 | System.Math; 21 | 22 | const 23 | PDFIUM_VERSION = 4; 24 | 25 | type 26 | {.$DEFINE USE_STRINGS} // use 'const AnsiString' instead of 'PAnsiChar' for input parameters 27 | {$IFDEF USE_STRINGS} 28 | TAnsiString = AnsiString; 29 | TString = string; 30 | TUTF8String = UTF8String; 31 | {$ELSE} 32 | TAnsiString = PAnsiChar; 33 | TString = PChar; 34 | TUTF8String = PAnsiChar; 35 | {$ENDIF} 36 | 37 | // One point is 1/72 inch (around 0.3528 mm). 38 | TPointsSize = record 39 | cx : Double; 40 | cy : Double; 41 | end; 42 | 43 | TPointsSizeF = record 44 | cx : Single; 45 | cy : Single; 46 | end; 47 | 48 | TRectF = record 49 | Left, Top, Right, Bottom: Single; 50 | end; 51 | 52 | TRectD = record 53 | Left, Top, Right, Bottom: Double; 54 | end; 55 | 56 | TPDFBitmapInfo = record 57 | Format: Integer; 58 | Width : Integer; 59 | Height: Integer; 60 | Stride: Integer; 61 | Buffer: Pointer; 62 | end; 63 | 64 | IPDFBookmark = interface 65 | function GetPageNumber: Integer; stdcall; 66 | function GetTitle(Text: PChar; Size: Integer): Integer; stdcall; 67 | function GetFirstChild(out Child: IPDFBookmark): Integer; stdcall; 68 | function GetNext: Integer; stdcall; 69 | end; 70 | 71 | IPDFAnnotation = interface 72 | function GetSubtype: Integer; stdcall; 73 | function GetRect(var Rect: TRectF): Integer; stdcall; 74 | function SetRect(const Rect: TRectF): Integer; stdcall; 75 | function GetString(const Key: TAnsiString; Str: PChar; Size: Integer): Integer; stdcall; 76 | function Remove: Integer; stdcall; 77 | end; 78 | 79 | IPDFSearchText = interface 80 | function FindNext: Integer; stdcall; 81 | function FindPrev: Integer; stdcall; 82 | function GetPosition(var Start, Length: Integer): Integer; stdcall; 83 | end; 84 | 85 | IPDFText = interface 86 | function CharCount: Integer; stdcall; 87 | function GetText(Start, Length: Integer; Text: PChar): Integer; stdcall; 88 | function CharIndexAtPos(const Pos: TPointsSize; distance: Integer): Integer; stdcall; 89 | function GetRectCount(Start, Length: Integer): Integer; stdcall; 90 | function GetRect(Index: Integer; var Rect: TRectD): Integer; stdcall; 91 | function Search(const Text: TString; Flags, StartIndex: Integer; out Search: IPDFSearchText): Integer; stdcall; 92 | end; 93 | 94 | IPDFBitmap = interface 95 | function Draw(DC: HDC; x, y: Integer): BOOL; stdcall; 96 | function GetInfo(var Info: TPDFBitmapInfo): BOOL; stdcall; 97 | end; 98 | 99 | IPDFPage = interface 100 | function Render(DC: HDC; const Rect: TRect; Rotation, Flags: Integer): Integer; stdcall; 101 | function GetAnnotationCount: Integer; stdcall; 102 | function GetAnnotation(Index: Integer; var Annotation: IPDFAnnotation): Integer; stdcall; 103 | function GetText(var Text: IPDFText): Integer; stdcall; 104 | procedure DeviceToPage(const Rect: TRect; x, y: Integer; var px, py: Double); stdcall; 105 | procedure PageToDevice(const Rect: TRect; px, py: Double; var x, y: Integer); stdcall; 106 | function GetRotation: Integer; stdcall; 107 | function GetBitmap(const PageRect, ViewPort: TRect; Rotation, Flags: Integer; out Bitmap: IPDFBitmap): Integer; stdcall; 108 | end; 109 | 110 | TWriteProc = function(Data: Pointer; Size: Integer; UserData: Pointer): Integer; stdcall; 111 | 112 | IPDFium = interface 113 | function GetVersion: Integer; stdcall; 114 | function GetError: Integer; stdcall; 115 | function CloseDocument: integer; stdcall; 116 | function LoadFromFile(const FileName, Password: TUTF8String): Integer; stdcall; 117 | function LoadFromMemory(data: Pointer; Size: Integer; const password: TAnsiString): Integer; stdcall; 118 | function GetPermissions: LongWord; stdcall; 119 | function GetPageCount: Integer; stdcall; 120 | function GetPageSize(Index: Integer; var Size: TPointsSizeF): Integer; stdcall; 121 | function GetPage(Index: Integer; out Page: IPDFPage): Integer; stdcall; 122 | function SaveToStream(Stream: IStream): Integer; stdcall; 123 | function SaveToProc(WriteProc: TWriteProc; UserData: Pointer): Integer; stdcall; 124 | function GetFirstBookmark(out Bookmark: IPDFBookmark): Integer; stdcall; 125 | function GetMetaText(const Name: TAnsiString; Value: PChar; ValueSize: Integer): Integer; stdcall; 126 | end; 127 | 128 | const 129 | {$IFDEF WIN64} 130 | libpdfium = 'libpdfiumx64.dll'; 131 | {$ELSE} 132 | libpdfium = 'libpdfium.dll'; 133 | {$ENDIF} 134 | 135 | FPDF_ERR_SUCCESS = 0; // No error. 136 | FPDF_ERR_UNKNOWN = 1; // Unknown error. 137 | FPDF_ERR_FILE = 2; // File not found or could not be opened. 138 | FPDF_ERR_FORMAT = 3; // File not in PDF format or corrupted. 139 | FPDF_ERR_PASSWORD = 4; // Password required or incorrect password. 140 | FPDF_ERR_SECURITY = 5; // Unsupported security scheme. 141 | FPDF_ERR_PAGE = 6; // Page not found or content error. 142 | 143 | FPDF_ANNOT = $01; // Set if annotations are to be rendered. 144 | FPDF_LCD_TEXT = $02; // Set if using text rendering optimized for LCD display. 145 | FPDF_NO_NATIVETEXT = $04; // Don't use the native text output available on some platforms 146 | FPDF_GRAYSCALE = $08; // Grayscale output. 147 | FPDF_DEBUG_INFO = $80; // Set if you want to get some debug info. 148 | // Please discuss with Foxit first if you need to collect debug info. 149 | FPDF_NO_CATCH = $100; // Set if you don't want to catch exception. 150 | FPDF_RENDER_LIMITEDIMAGECACHE = $200; // Limit image cache size. 151 | FPDF_RENDER_FORCEHALFTONE = $400; // Always use halftone for image stretching. 152 | FPDF_PRINTING = $800; // Render for printing. 153 | FPDF_REVERSE_BYTE_ORDER = $10; //set whether render in a reverse Byte order, this flag only 154 | 155 | FPDFANNOT_TEXTTYPE_Contents = 'Contents'; 156 | FPDFANNOT_TEXTTYPE_Author = 'T'; 157 | 158 | FPDF_ANNOT_UNKNOWN = 0; 159 | FPDF_ANNOT_TEXT = 1; 160 | FPDF_ANNOT_LINK = 2; 161 | FPDF_ANNOT_FREETEXT = 3; 162 | FPDF_ANNOT_LINE = 4; 163 | FPDF_ANNOT_SQUARE = 5; 164 | FPDF_ANNOT_CIRCLE = 6; 165 | FPDF_ANNOT_POLYGON = 7; 166 | FPDF_ANNOT_POLYLINE = 8; 167 | FPDF_ANNOT_HIGHLIGHT = 9; 168 | FPDF_ANNOT_UNDERLINE = 10; 169 | FPDF_ANNOT_SQUIGGLY = 11; 170 | FPDF_ANNOT_STRIKEOUT = 12; 171 | FPDF_ANNOT_STAMP = 13; 172 | FPDF_ANNOT_CARET = 14; 173 | FPDF_ANNOT_INK = 15; 174 | FPDF_ANNOT_POPUP = 16; 175 | FPDF_ANNOT_FILEATTACHMENT = 17; 176 | FPDF_ANNOT_SOUND = 18; 177 | FPDF_ANNOT_MOVIE = 19; 178 | FPDF_ANNOT_WIDGET = 20; 179 | FPDF_ANNOT_SCREEN = 21; 180 | FPDF_ANNOT_PRINTERMARK = 22; 181 | FPDF_ANNOT_TRAPNET = 23; 182 | FPDF_ANNOT_WATERMARK = 24; 183 | FPDF_ANNOT_THREED = 25; 184 | FPDF_ANNOT_RICHMEDIA = 26; 185 | FPDF_ANNOT_XFAWIDGET = 27; 186 | 187 | function PDF_Create(RequestedVersion: Integer; out PDF: IPDFium): Integer; stdcall; 188 | external libpdfium delayed; 189 | 190 | implementation 191 | 192 | {$IFDEF WIN64} 193 | initialization 194 | SetExceptionMask(exAllArithmeticExceptions); 195 | {$ENDIF} 196 | end. -------------------------------------------------------------------------------- /src/Main.dfm: -------------------------------------------------------------------------------- 1 | object MainForm: TMainForm 2 | Left = 0 3 | Top = 0 4 | Caption = 'PDFium Reader (c)2017-2019 Execute SARL' 5 | ClientHeight = 554 6 | ClientWidth = 608 7 | Color = clBtnFace 8 | Font.Charset = DEFAULT_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Tahoma' 12 | Font.Style = [] 13 | Menu = MainMenu1 14 | OldCreateOrder = False 15 | Position = poScreenCenter 16 | OnCreate = FormCreate 17 | OnDestroy = FormDestroy 18 | PixelsPerInch = 96 19 | TextHeight = 13 20 | inline PDFium: TPDFiumFrame 21 | Left = 0 22 | Top = 48 23 | Width = 608 24 | Height = 506 25 | HorzScrollBar.Tracking = True 26 | VertScrollBar.Increment = 27 27 | VertScrollBar.Tracking = True 28 | Align = alClient 29 | DoubleBuffered = True 30 | Color = clGray 31 | ParentBackground = False 32 | ParentColor = False 33 | ParentDoubleBuffered = False 34 | TabOrder = 0 35 | OnResize = PDFiumResize 36 | ExplicitTop = 48 37 | ExplicitWidth = 608 38 | ExplicitHeight = 506 39 | end 40 | object pnButtons: TPanel 41 | Left = 0 42 | Top = 0 43 | Width = 608 44 | Height = 48 45 | Align = alTop 46 | Caption = 'pnButtons' 47 | ParentBackground = False 48 | ParentShowHint = False 49 | ShowCaption = False 50 | ShowHint = True 51 | TabOrder = 1 52 | object btZPlus: TPaintBox 53 | Tag = 4 54 | AlignWithMargins = True 55 | Left = 108 56 | Top = 12 57 | Width = 24 58 | Height = 24 59 | Hint = 'Zoom in' 60 | Margins.Left = 5 61 | Margins.Top = 11 62 | Margins.Right = 5 63 | Margins.Bottom = 11 64 | Align = alLeft 65 | OnClick = btZPlusClick 66 | OnDblClick = btZPlusClick 67 | OnMouseEnter = ButtonMouseEnter 68 | OnMouseLeave = ButtonMouseLeave 69 | OnPaint = ButtonPaint 70 | ExplicitLeft = 41 71 | end 72 | object btZMinus: TPaintBox 73 | Tag = 2 74 | AlignWithMargins = True 75 | Left = 74 76 | Top = 12 77 | Width = 24 78 | Height = 24 79 | Hint = 'Zoom out' 80 | Margins.Left = 5 81 | Margins.Top = 11 82 | Margins.Right = 5 83 | Margins.Bottom = 11 84 | Align = alLeft 85 | OnClick = btZPlusClick 86 | OnDblClick = btZPlusClick 87 | OnMouseEnter = ButtonMouseEnter 88 | OnMouseLeave = ButtonMouseLeave 89 | OnPaint = ButtonPaint 90 | ExplicitLeft = 1 91 | ExplicitTop = 1 92 | ExplicitHeight = 46 93 | end 94 | object btOpen: TPaintBox 95 | AlignWithMargins = True 96 | Left = 6 97 | Top = 12 98 | Width = 24 99 | Height = 24 100 | Hint = 'Open file' 101 | Margins.Left = 5 102 | Margins.Top = 11 103 | Margins.Right = 5 104 | Margins.Bottom = 11 105 | Align = alLeft 106 | OnClick = Open1Click 107 | OnMouseEnter = ButtonMouseEnter 108 | OnMouseLeave = ButtonMouseLeave 109 | OnPaint = ButtonPaint 110 | ExplicitTop = 10 111 | end 112 | object pbZoom: TPaintBox 113 | AlignWithMargins = True 114 | Left = 140 115 | Top = 10 116 | Width = 72 117 | Height = 28 118 | Hint = 'Zoom' 119 | Margins.Top = 9 120 | Margins.Bottom = 9 121 | Align = alLeft 122 | OnMouseDown = pbZoomMouseDown 123 | OnMouseEnter = ButtonMouseEnter 124 | OnMouseLeave = ButtonMouseLeave 125 | OnPaint = pbZoomPaint 126 | ExplicitLeft = 106 127 | end 128 | object btPageWidth: TPaintBox 129 | Tag = 6 130 | AlignWithMargins = True 131 | Left = 288 132 | Top = 12 133 | Width = 24 134 | Height = 24 135 | Hint = 'Page width' 136 | Margins.Left = 5 137 | Margins.Top = 11 138 | Margins.Right = 5 139 | Margins.Bottom = 11 140 | Align = alLeft 141 | OnClick = mnFitWidthClick 142 | OnDblClick = mnFitWidthClick 143 | OnMouseEnter = ButtonMouseEnter 144 | OnMouseLeave = ButtonMouseLeave 145 | OnPaint = ButtonPaint 146 | ExplicitLeft = 338 147 | ExplicitTop = 24 148 | end 149 | object btFullPage: TPaintBox 150 | Tag = 8 151 | AlignWithMargins = True 152 | Left = 254 153 | Top = 12 154 | Width = 24 155 | Height = 24 156 | Hint = 'Page level' 157 | Margins.Left = 5 158 | Margins.Top = 11 159 | Margins.Right = 5 160 | Margins.Bottom = 11 161 | Align = alLeft 162 | OnClick = mnPageLevelClick 163 | OnDblClick = mnPageLevelClick 164 | OnMouseEnter = ButtonMouseEnter 165 | OnMouseLeave = ButtonMouseLeave 166 | OnPaint = ButtonPaint 167 | ExplicitLeft = 220 168 | ExplicitTop = 10 169 | end 170 | object btActualSize: TPaintBox 171 | Tag = 10 172 | AlignWithMargins = True 173 | Left = 220 174 | Top = 12 175 | Width = 24 176 | Height = 24 177 | Hint = 'Actual size' 178 | Margins.Left = 5 179 | Margins.Top = 11 180 | Margins.Right = 5 181 | Margins.Bottom = 11 182 | Align = alLeft 183 | OnClick = mnActualSizeClick 184 | OnDblClick = mnActualSizeClick 185 | OnMouseEnter = ButtonMouseEnter 186 | OnMouseLeave = ButtonMouseLeave 187 | OnPaint = ButtonPaint 188 | ExplicitLeft = 186 189 | ExplicitTop = 10 190 | end 191 | object btAbout: TPaintBox 192 | Tag = 12 193 | AlignWithMargins = True 194 | Left = 578 195 | Top = 12 196 | Width = 24 197 | Height = 24 198 | Hint = 'Execute SARL' 199 | Margins.Left = 5 200 | Margins.Top = 11 201 | Margins.Right = 5 202 | Margins.Bottom = 11 203 | Align = alRight 204 | OnClick = btAboutClick 205 | OnMouseEnter = ButtonMouseEnter 206 | OnMouseLeave = ButtonMouseLeave 207 | OnPaint = ButtonPaint 208 | ExplicitLeft = 338 209 | ExplicitTop = 24 210 | end 211 | object btPrint: TPaintBox 212 | Tag = 18 213 | AlignWithMargins = True 214 | Left = 40 215 | Top = 12 216 | Width = 24 217 | Height = 24 218 | Hint = 'Print' 219 | Margins.Left = 5 220 | Margins.Top = 11 221 | Margins.Right = 5 222 | Margins.Bottom = 11 223 | Align = alLeft 224 | OnClick = btPrintClick 225 | OnMouseEnter = ButtonMouseEnter 226 | OnMouseLeave = ButtonMouseLeave 227 | OnPaint = ButtonPaint 228 | ExplicitLeft = 1 229 | ExplicitTop = 1 230 | ExplicitHeight = 46 231 | end 232 | object pnPages: TPanel 233 | Left = 317 234 | Top = 1 235 | Width = 158 236 | Height = 46 237 | Align = alLeft 238 | BevelOuter = bvNone 239 | Caption = 'pnPages' 240 | ParentBackground = False 241 | ParentColor = True 242 | ShowCaption = False 243 | TabOrder = 0 244 | Visible = False 245 | OnResize = pnPagesResize 246 | object btNext: TPaintBox 247 | Tag = 16 248 | AlignWithMargins = True 249 | Left = 39 250 | Top = 11 251 | Width = 24 252 | Height = 24 253 | Hint = 'Page width' 254 | Margins.Left = 5 255 | Margins.Top = 11 256 | Margins.Right = 5 257 | Margins.Bottom = 11 258 | Align = alLeft 259 | OnClick = btNextClick 260 | OnDblClick = btNextClick 261 | OnMouseEnter = ButtonMouseEnter 262 | OnMouseLeave = ButtonMouseLeave 263 | OnPaint = ButtonPaint 264 | ExplicitLeft = 374 265 | ExplicitTop = 10 266 | end 267 | object btPrev: TPaintBox 268 | Tag = 14 269 | AlignWithMargins = True 270 | Left = 5 271 | Top = 11 272 | Width = 24 273 | Height = 24 274 | Hint = 'Page width' 275 | Margins.Left = 5 276 | Margins.Top = 11 277 | Margins.Right = 5 278 | Margins.Bottom = 11 279 | Align = alLeft 280 | OnClick = btPrevClick 281 | OnDblClick = btPrevClick 282 | OnMouseEnter = ButtonMouseEnter 283 | OnMouseLeave = ButtonMouseLeave 284 | OnPaint = ButtonPaint 285 | ExplicitTop = 9 286 | end 287 | object lbPages: TLabel 288 | Left = 113 289 | Top = 0 290 | Width = 24 291 | Height = 46 292 | Align = alLeft 293 | Caption = '(0/0)' 294 | Font.Charset = DEFAULT_CHARSET 295 | Font.Color = 5066061 296 | Font.Height = -11 297 | Font.Name = 'Tahoma' 298 | Font.Style = [] 299 | ParentFont = False 300 | Layout = tlCenter 301 | ExplicitHeight = 13 302 | end 303 | object shPage: TShape 304 | Left = 77 305 | Top = 32 306 | Width = 31 307 | Height = 1 308 | Brush.Style = bsClear 309 | Pen.Color = 13355979 310 | end 311 | object edPage: TEdit 312 | AlignWithMargins = True 313 | Left = 74 314 | Top = 16 315 | Width = 33 316 | Height = 14 317 | Margins.Left = 6 318 | Margins.Top = 16 319 | Margins.Right = 6 320 | Margins.Bottom = 16 321 | TabStop = False 322 | Align = alLeft 323 | Alignment = taCenter 324 | BorderStyle = bsNone 325 | Font.Charset = DEFAULT_CHARSET 326 | Font.Color = 5066061 327 | Font.Height = -11 328 | Font.Name = 'Tahoma' 329 | Font.Style = [] 330 | ParentColor = True 331 | ParentFont = False 332 | TabOrder = 0 333 | Text = '0' 334 | OnExit = edPageExit 335 | OnKeyDown = edPageKeyDown 336 | end 337 | end 338 | end 339 | object MainMenu1: TMainMenu 340 | Left = 176 341 | Top = 256 342 | object File1: TMenuItem 343 | Caption = '&File' 344 | object Open1: TMenuItem 345 | Caption = '&Open...' 346 | ShortCut = 16463 347 | OnClick = Open1Click 348 | end 349 | object Close1: TMenuItem 350 | Caption = 'Close' 351 | OnClick = Close1Click 352 | end 353 | object mnProperties: TMenuItem 354 | Caption = 'Properties' 355 | OnClick = mnPropertiesClick 356 | end 357 | object N1: TMenuItem 358 | Caption = '-' 359 | end 360 | object Quit1: TMenuItem 361 | Caption = '&Quit' 362 | ShortCut = 16465 363 | OnClick = Quit1Click 364 | end 365 | end 366 | object Edit1: TMenuItem 367 | Caption = 'Edit' 368 | object Copy1: TMenuItem 369 | Caption = 'Copy' 370 | ShortCut = 16451 371 | OnClick = Copy1Click 372 | end 373 | object Search1: TMenuItem 374 | Caption = 'Search...' 375 | ShortCut = 16454 376 | OnClick = Search1Click 377 | end 378 | end 379 | end 380 | object ppZoom: TPopupMenu 381 | OnPopup = ppZoomPopup 382 | Left = 336 383 | Top = 256 384 | object N101: TMenuItem 385 | Tag = 10 386 | Caption = '10%' 387 | OnClick = MenuZoomClick 388 | end 389 | object N251: TMenuItem 390 | Tag = 25 391 | Caption = '25%' 392 | OnClick = MenuZoomClick 393 | end 394 | object N501: TMenuItem 395 | Tag = 50 396 | Caption = '50%' 397 | OnClick = MenuZoomClick 398 | end 399 | object N1001: TMenuItem 400 | Tag = 75 401 | Caption = '75%' 402 | OnClick = MenuZoomClick 403 | end 404 | object N1002: TMenuItem 405 | Tag = 100 406 | Caption = '100%' 407 | OnClick = MenuZoomClick 408 | end 409 | object N1251: TMenuItem 410 | Tag = 125 411 | Caption = '125%' 412 | OnClick = MenuZoomClick 413 | end 414 | object N1501: TMenuItem 415 | Tag = 150 416 | Caption = '150%' 417 | OnClick = MenuZoomClick 418 | end 419 | object N2001: TMenuItem 420 | Tag = 200 421 | Caption = '200%' 422 | OnClick = MenuZoomClick 423 | end 424 | object N4001: TMenuItem 425 | Tag = 400 426 | Caption = '400%' 427 | OnClick = MenuZoomClick 428 | end 429 | object N8001: TMenuItem 430 | Tag = 800 431 | Caption = '800%' 432 | OnClick = MenuZoomClick 433 | end 434 | object N16001: TMenuItem 435 | Tag = 1600 436 | Caption = '1600%' 437 | OnClick = MenuZoomClick 438 | end 439 | object N24001: TMenuItem 440 | Tag = 2400 441 | Caption = '2400%' 442 | OnClick = MenuZoomClick 443 | end 444 | object N32001: TMenuItem 445 | Tag = 3200 446 | Caption = '3200%' 447 | OnClick = MenuZoomClick 448 | end 449 | object N64001: TMenuItem 450 | Tag = 6400 451 | Caption = '6400%' 452 | OnClick = MenuZoomClick 453 | end 454 | object N2: TMenuItem 455 | Caption = '-' 456 | end 457 | object mnActualSize: TMenuItem 458 | Caption = 'Actual size' 459 | OnClick = mnActualSizeClick 460 | end 461 | object mnPageLevel: TMenuItem 462 | Caption = 'Zoom to page level' 463 | OnClick = mnPageLevelClick 464 | end 465 | object mnFitWidth: TMenuItem 466 | Caption = 'Fit width' 467 | OnClick = mnFitWidthClick 468 | end 469 | end 470 | end 471 | -------------------------------------------------------------------------------- /src/Main.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tothpaul/PDFiumReader/e6d9c08d6a187cc38bf5908a29cd8a49e22232b3/src/Main.pas -------------------------------------------------------------------------------- /src/PDFium.Frame.dfm: -------------------------------------------------------------------------------- 1 | object PDFiumFrame: TPDFiumFrame 2 | Left = 0 3 | Top = 0 4 | Width = 451 5 | Height = 305 6 | HorzScrollBar.Tracking = True 7 | VertScrollBar.Increment = 27 8 | VertScrollBar.Tracking = True 9 | Align = alClient 10 | DoubleBuffered = True 11 | Color = clGray 12 | ParentBackground = False 13 | ParentColor = False 14 | ParentDoubleBuffered = False 15 | TabOrder = 0 16 | end 17 | -------------------------------------------------------------------------------- /src/PDFium.Frame.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tothpaul/PDFiumReader/e6d9c08d6a187cc38bf5908a29cd8a49e22232b3/src/PDFium.Frame.pas -------------------------------------------------------------------------------- /src/PDFium.PrintDlg.dfm: -------------------------------------------------------------------------------- 1 | object PrintDlg: TPrintDlg 2 | Left = 0 3 | Top = 0 4 | BorderStyle = bsDialog 5 | Caption = 'Printer' 6 | ClientHeight = 634 7 | ClientWidth = 720 8 | Color = clBtnShadow 9 | Font.Charset = DEFAULT_CHARSET 10 | Font.Color = clWindowText 11 | Font.Height = -11 12 | Font.Name = 'Tahoma' 13 | Font.Style = [] 14 | OldCreateOrder = False 15 | Position = poOwnerFormCenter 16 | OnCreate = FormCreate 17 | PixelsPerInch = 96 18 | TextHeight = 13 19 | object Panel1: TPanel 20 | AlignWithMargins = True 21 | Left = 0 22 | Top = 0 23 | Width = 720 24 | Height = 89 25 | Margins.Left = 0 26 | Margins.Top = 0 27 | Margins.Right = 0 28 | Margins.Bottom = 1 29 | Align = alTop 30 | BevelOuter = bvNone 31 | Caption = 'Panel1' 32 | ParentBackground = False 33 | ShowCaption = False 34 | TabOrder = 0 35 | object LabelImprimante: TLabel 36 | Left = 10 37 | Top = 16 38 | Width = 32 39 | Height = 13 40 | Caption = 'Printer' 41 | end 42 | object LabelCopies: TLabel 43 | Left = 10 44 | Top = 56 45 | Width = 39 46 | Height = 13 47 | Caption = 'Copies :' 48 | end 49 | object cbPrinters: TComboBox 50 | Left = 93 51 | Top = 11 52 | Width = 303 53 | Height = 27 54 | Style = csOwnerDrawFixed 55 | ItemHeight = 21 56 | TabOrder = 0 57 | OnChange = cbPrintersChange 58 | end 59 | object btProperties: TButton 60 | Left = 403 61 | Top = 9 62 | Width = 114 63 | Height = 34 64 | Caption = 'Properties' 65 | TabOrder = 1 66 | OnClick = btPropertiesClick 67 | end 68 | object seCopies: TSpinEdit 69 | Left = 60 70 | Top = 53 71 | Width = 49 72 | Height = 22 73 | MaxValue = 999 74 | MinValue = 1 75 | TabOrder = 2 76 | Value = 1 77 | end 78 | object cbGrouped: TCheckBox 79 | Left = 114 80 | Top = 57 81 | Width = 87 82 | Height = 17 83 | Caption = 'Collate' 84 | TabOrder = 3 85 | end 86 | object cbAnnotations: TCheckBox 87 | Left = 207 88 | Top = 57 89 | Width = 177 90 | Height = 17 91 | Caption = 'Print annotations' 92 | Checked = True 93 | State = cbChecked 94 | TabOrder = 4 95 | OnClick = cbAnnotationsClick 96 | end 97 | end 98 | object Panel6: TPanel 99 | AlignWithMargins = True 100 | Left = 0 101 | Top = 584 102 | Width = 720 103 | Height = 50 104 | Margins.Left = 0 105 | Margins.Top = 1 106 | Margins.Right = 0 107 | Margins.Bottom = 0 108 | Align = alBottom 109 | BevelOuter = bvNone 110 | Caption = 'Panel2' 111 | ParentBackground = False 112 | ShowCaption = False 113 | TabOrder = 1 114 | object btCancel: TButton 115 | AlignWithMargins = True 116 | Left = 602 117 | Top = 5 118 | Width = 113 119 | Height = 40 120 | Margins.Left = 5 121 | Margins.Top = 5 122 | Margins.Right = 5 123 | Margins.Bottom = 5 124 | Align = alRight 125 | Cancel = True 126 | Caption = 'Cancel' 127 | ModalResult = 2 128 | TabOrder = 1 129 | end 130 | object btPrint: TButton 131 | AlignWithMargins = True 132 | Left = 479 133 | Top = 5 134 | Width = 113 135 | Height = 40 136 | Margins.Left = 5 137 | Margins.Top = 5 138 | Margins.Right = 5 139 | Margins.Bottom = 5 140 | Align = alRight 141 | Caption = 'Print' 142 | Default = True 143 | TabOrder = 0 144 | OnClick = btPrintClick 145 | end 146 | end 147 | object Panel2: TPanel 148 | AlignWithMargins = True 149 | Left = 401 150 | Top = 90 151 | Width = 319 152 | Height = 493 153 | Margins.Left = 1 154 | Margins.Top = 0 155 | Margins.Right = 0 156 | Margins.Bottom = 0 157 | Align = alRight 158 | BevelOuter = bvNone 159 | Caption = 'Panel2' 160 | DoubleBuffered = True 161 | ParentBackground = False 162 | ParentDoubleBuffered = False 163 | ShowCaption = False 164 | TabOrder = 2 165 | object PaintBox: TPaintBox 166 | Left = 15 167 | Top = 55 168 | Width = 290 169 | Height = 380 170 | OnPaint = PaintBoxPaint 171 | end 172 | object lbScale: TLabel 173 | Left = 10 174 | Top = 8 175 | Width = 61 176 | Height = 13 177 | Caption = 'Scale: 100%' 178 | end 179 | object lbPageSize: TLabel 180 | Left = 15 181 | Top = 30 182 | Width = 52 183 | Height = 13 184 | Caption = '21 x 29 cm' 185 | end 186 | object btFirst: TButton 187 | Tag = -2 188 | Left = 16 189 | Top = 448 190 | Width = 48 191 | Height = 41 192 | Caption = '9' 193 | Font.Charset = SYMBOL_CHARSET 194 | Font.Color = clGray 195 | Font.Height = -27 196 | Font.Name = 'Webdings' 197 | Font.Style = [] 198 | ParentFont = False 199 | TabOrder = 0 200 | TabStop = False 201 | OnClick = btNavigate 202 | end 203 | object btPrev: TButton 204 | Tag = -1 205 | Left = 70 206 | Top = 448 207 | Width = 48 208 | Height = 41 209 | Caption = '3' 210 | Font.Charset = SYMBOL_CHARSET 211 | Font.Color = clGray 212 | Font.Height = -27 213 | Font.Name = 'Webdings' 214 | Font.Style = [] 215 | ParentFont = False 216 | TabOrder = 1 217 | TabStop = False 218 | OnClick = btNavigate 219 | end 220 | object btLast: TButton 221 | Tag = 2 222 | Left = 256 223 | Top = 448 224 | Width = 48 225 | Height = 41 226 | Caption = ':' 227 | Font.Charset = SYMBOL_CHARSET 228 | Font.Color = clGray 229 | Font.Height = -27 230 | Font.Name = 'Webdings' 231 | Font.Style = [] 232 | ParentFont = False 233 | TabOrder = 2 234 | TabStop = False 235 | OnClick = btNavigate 236 | end 237 | object btNext: TButton 238 | Tag = 1 239 | Left = 202 240 | Top = 448 241 | Width = 48 242 | Height = 41 243 | Caption = '4' 244 | Font.Charset = SYMBOL_CHARSET 245 | Font.Color = clGray 246 | Font.Height = -27 247 | Font.Name = 'Webdings' 248 | Font.Style = [] 249 | ParentFont = False 250 | TabOrder = 3 251 | TabStop = False 252 | OnClick = btNavigate 253 | end 254 | object edPage: TEdit 255 | Left = 124 256 | Top = 455 257 | Width = 72 258 | Height = 21 259 | TabStop = False 260 | TabOrder = 4 261 | Text = '1 / 1' 262 | OnChange = edPageChange 263 | OnExit = edPageExit 264 | end 265 | end 266 | object Panel3: TPanel 267 | Left = 0 268 | Top = 90 269 | Width = 400 270 | Height = 493 271 | Align = alClient 272 | BevelOuter = bvNone 273 | Caption = 'Panel3' 274 | ParentBackground = False 275 | ParentColor = True 276 | ShowCaption = False 277 | TabOrder = 3 278 | object Panel5: TPanel 279 | AlignWithMargins = True 280 | Left = 0 281 | Top = 377 282 | Width = 400 283 | Height = 116 284 | Margins.Left = 0 285 | Margins.Top = 0 286 | Margins.Right = 0 287 | Margins.Bottom = 0 288 | Align = alClient 289 | BevelOuter = bvNone 290 | Caption = 'Panel2' 291 | Padding.Left = 5 292 | Padding.Top = 5 293 | Padding.Right = 5 294 | Padding.Bottom = 5 295 | ParentBackground = False 296 | ShowCaption = False 297 | TabOrder = 2 298 | object CardPanel1: TCardPanel 299 | Left = 5 300 | Top = 5 301 | Width = 390 302 | Height = 106 303 | Align = alClient 304 | ActiveCard = CardEchelle 305 | BevelOuter = bvNone 306 | Caption = 'CardPanel1' 307 | ParentBackground = False 308 | ParentColor = True 309 | TabOrder = 0 310 | OnCardChange = CardPanel1CardChange 311 | object CardEchelle: TCard 312 | Left = 0 313 | Top = 0 314 | Width = 390 315 | Height = 106 316 | Caption = 'Echelle' 317 | CardIndex = 0 318 | ParentColor = True 319 | TabOrder = 0 320 | object Label6: TLabel 321 | Left = 242 322 | Top = 76 323 | Width = 11 324 | Height = 13 325 | Caption = '%' 326 | end 327 | object rbScale: TRadioButton 328 | Left = 10 329 | Top = 6 330 | Width = 113 331 | Height = 17 332 | Caption = 'Fit' 333 | Checked = True 334 | TabOrder = 0 335 | TabStop = True 336 | OnClick = rbScaleClick 337 | end 338 | object rbRealSize: TRadioButton 339 | Tag = 1 340 | Left = 10 341 | Top = 29 342 | Width = 113 343 | Height = 17 344 | Caption = 'Actual size' 345 | TabOrder = 1 346 | OnClick = rbScaleClick 347 | end 348 | object rbReduice: TRadioButton 349 | Tag = 2 350 | Left = 10 351 | Top = 52 352 | Width = 218 353 | Height = 17 354 | Caption = 'Shrink oversized pages' 355 | TabOrder = 2 356 | OnClick = rbScaleClick 357 | end 358 | object rbCustomScale: TRadioButton 359 | Tag = 3 360 | Left = 10 361 | Top = 77 362 | Width = 147 363 | Height = 17 364 | Caption = 'Custom scale' 365 | TabOrder = 3 366 | OnClick = rbScaleClick 367 | end 368 | object edCustomScale: TEdit 369 | Left = 168 370 | Top = 73 371 | Width = 71 372 | Height = 21 373 | Enabled = False 374 | TabOrder = 4 375 | Text = '100' 376 | OnChange = edCustomScaleChange 377 | OnExit = edCustomScaleExit 378 | end 379 | end 380 | object cdMulti: TCard 381 | Left = 0 382 | Top = 0 383 | Width = 390 384 | Height = 106 385 | Caption = 'Mise en page' 386 | CardIndex = 1 387 | TabOrder = 1 388 | object LabelpagesparFeuilles: TLabel 389 | Left = 5 390 | Top = 11 391 | Width = 82 392 | Height = 13 393 | Caption = 'Pages per sheet:' 394 | end 395 | object LabelOrdrePages: TLabel 396 | Left = 5 397 | Top = 49 398 | Width = 57 399 | Height = 13 400 | Caption = 'Page order:' 401 | end 402 | object cbSheets: TComboBox 403 | Left = 120 404 | Top = 8 405 | Width = 96 406 | Height = 27 407 | Style = csOwnerDrawFixed 408 | ItemHeight = 21 409 | ItemIndex = 0 410 | TabOrder = 0 411 | Text = '2' 412 | OnChange = cbSheetsChange 413 | Items.Strings = ( 414 | '2' 415 | '4' 416 | '6' 417 | '9' 418 | '16') 419 | end 420 | object cbPageOrder: TComboBox 421 | Left = 120 422 | Top = 41 423 | Width = 170 424 | Height = 27 425 | Style = csOwnerDrawFixed 426 | ItemHeight = 21 427 | ItemIndex = 0 428 | TabOrder = 1 429 | Text = 'Horizontal' 430 | OnChange = cbPageOrderChange 431 | Items.Strings = ( 432 | 'Horizontal' 433 | 'Horizontal reversed' 434 | 'Vertical' 435 | 'Vertical reversed') 436 | end 437 | object cbPageContour: TCheckBox 438 | Left = 5 439 | Top = 85 440 | Width = 154 441 | Height = 17 442 | Caption = 'Print page border' 443 | TabOrder = 2 444 | OnClick = cbPageContourClick 445 | end 446 | end 447 | end 448 | end 449 | object Panel7: TPanel 450 | Left = 0 451 | Top = 0 452 | Width = 400 453 | Height = 145 454 | Align = alTop 455 | BevelOuter = bvNone 456 | Caption = 'Panel2' 457 | ParentBackground = False 458 | ShowCaption = False 459 | TabOrder = 0 460 | object LabelpagesImprimer: TLabel 461 | Left = 10 462 | Top = 6 463 | Width = 82 464 | Height = 18 465 | Caption = 'Pages to print' 466 | Font.Charset = ANSI_CHARSET 467 | Font.Color = clWindowText 468 | Font.Height = -14 469 | Font.Name = 'Source Sans Pro' 470 | Font.Style = [] 471 | ParentFont = False 472 | end 473 | object Labelimpairespaires: TLabel 474 | Left = 15 475 | Top = 110 476 | Width = 94 477 | Height = 13 478 | Caption = 'Even or odd pages:' 479 | end 480 | object rbAllPages: TRadioButton 481 | Left = 15 482 | Top = 30 483 | Width = 186 484 | Height = 17 485 | Caption = 'All' 486 | Checked = True 487 | TabOrder = 0 488 | TabStop = True 489 | OnClick = rbAllPagesClick 490 | end 491 | object rbCurrentPage: TRadioButton 492 | Left = 15 493 | Top = 54 494 | Width = 169 495 | Height = 17 496 | Caption = 'Current page' 497 | TabOrder = 1 498 | OnClick = rbAllPagesClick 499 | end 500 | object rbCustomPages: TRadioButton 501 | Left = 15 502 | Top = 77 503 | Width = 73 504 | Height = 17 505 | Caption = 'Pages' 506 | TabOrder = 2 507 | OnClick = rbAllPagesClick 508 | end 509 | object edPages: TEdit 510 | Left = 98 511 | Top = 73 512 | Width = 197 513 | Height = 21 514 | Enabled = False 515 | TabOrder = 3 516 | Text = '1' 517 | OnChange = edPagesChange 518 | end 519 | object cbOddPages: TComboBox 520 | Left = 182 521 | Top = 105 522 | Width = 197 523 | Height = 27 524 | Style = csOwnerDrawFixed 525 | ItemHeight = 21 526 | ItemIndex = 0 527 | TabOrder = 4 528 | Text = 'Even and odd pages' 529 | OnChange = cbOddPagesChange 530 | Items.Strings = ( 531 | 'Even and odd pages' 532 | 'Odd pages only' 533 | 'Even pages only') 534 | end 535 | end 536 | object Panel8: TPanel 537 | AlignWithMargins = True 538 | Left = 0 539 | Top = 146 540 | Width = 400 541 | Height = 191 542 | Margins.Left = 0 543 | Margins.Top = 1 544 | Margins.Right = 0 545 | Margins.Bottom = 0 546 | Align = alTop 547 | BevelOuter = bvNone 548 | Caption = 'Panel2' 549 | ParentBackground = False 550 | ShowCaption = False 551 | TabOrder = 1 552 | object LabelOrientation: TLabel 553 | Left = 10 554 | Top = 50 555 | Width = 58 556 | Height = 13 557 | Caption = 'Orientation:' 558 | end 559 | object Labelrectoverso: TLabel 560 | Left = 10 561 | Top = 20 562 | Width = 105 563 | Height = 13 564 | Caption = 'Double-sided printing:' 565 | end 566 | object rbAuto: TRadioButton 567 | Left = 15 568 | Top = 69 569 | Width = 201 570 | Height = 20 571 | Caption = 'Automatic portrait/landscape' 572 | Checked = True 573 | TabOrder = 1 574 | TabStop = True 575 | OnClick = rbAutoClick 576 | end 577 | object rbPortrait: TRadioButton 578 | Tag = 1 579 | Left = 15 580 | Top = 95 581 | Width = 169 582 | Height = 20 583 | Caption = 'Portrait' 584 | TabOrder = 2 585 | OnClick = rbAutoClick 586 | end 587 | object rbLandscape: TRadioButton 588 | Tag = 2 589 | Left = 15 590 | Top = 118 591 | Width = 169 592 | Height = 20 593 | Caption = 'Landscape' 594 | TabOrder = 3 595 | OnClick = rbAutoClick 596 | end 597 | object cbRectoVerso: TComboBox 598 | Left = 182 599 | Top = 17 600 | Width = 197 601 | Height = 27 602 | Style = csOwnerDrawFixed 603 | ItemHeight = 21 604 | ItemIndex = 0 605 | TabOrder = 0 606 | Text = 'Off' 607 | Items.Strings = ( 608 | 'Off' 609 | 'Flip on long edge' 610 | 'Flip on short edge') 611 | end 612 | object cbGrayscale: TCheckBox 613 | Left = 10 614 | Top = 144 615 | Width = 276 616 | Height = 17 617 | Caption = 'Print in grayscale (black and white)' 618 | TabOrder = 4 619 | OnClick = cbGrayscaleClick 620 | end 621 | object cbCenter: TCheckBox 622 | Left = 10 623 | Top = 167 624 | Width = 276 625 | Height = 17 626 | Caption = 'Center in the page' 627 | Checked = True 628 | State = cbChecked 629 | TabOrder = 5 630 | OnClick = cbCenterClick 631 | end 632 | end 633 | object Panel4: TPanel 634 | Left = 0 635 | Top = 337 636 | Width = 400 637 | Height = 40 638 | Align = alTop 639 | BevelOuter = bvNone 640 | Caption = 'Panel4' 641 | Padding.Left = 3 642 | ParentBackground = False 643 | ShowCaption = False 644 | TabOrder = 3 645 | object Shape1: TShape 646 | AlignWithMargins = True 647 | Left = 6 648 | Top = 36 649 | Width = 391 650 | Height = 1 651 | Align = alBottom 652 | Brush.Style = bsClear 653 | Pen.Color = clMedGray 654 | ExplicitLeft = 0 655 | ExplicitTop = -24 656 | ExplicitWidth = 400 657 | end 658 | object tabScale: TLabel 659 | Left = 3 660 | Top = 0 661 | Width = 68 662 | Height = 33 663 | Align = alLeft 664 | Alignment = taCenter 665 | AutoSize = False 666 | Caption = 'Scale' 667 | Font.Charset = DEFAULT_CHARSET 668 | Font.Color = clWindowText 669 | Font.Height = -11 670 | Font.Name = 'Tahoma' 671 | Font.Style = [fsBold] 672 | ParentFont = False 673 | Layout = tlCenter 674 | OnClick = tabScaleClick 675 | ExplicitLeft = -6 676 | ExplicitTop = -1 677 | ExplicitHeight = 34 678 | end 679 | object tabPageLayout: TLabel 680 | Tag = 1 681 | Left = 71 682 | Top = 0 683 | Width = 85 684 | Height = 33 685 | Align = alLeft 686 | Alignment = taCenter 687 | AutoSize = False 688 | Caption = 'Page layout' 689 | Layout = tlCenter 690 | OnClick = tabScaleClick 691 | ExplicitLeft = 77 692 | ExplicitTop = -1 693 | end 694 | object tabShape: TShape 695 | Left = 3 696 | Top = 30 697 | Width = 68 698 | Height = 8 699 | Brush.Color = clTeal 700 | Pen.Style = psClear 701 | end 702 | end 703 | end 704 | end 705 | -------------------------------------------------------------------------------- /src/PDFium.PrintDlg.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tothpaul/PDFiumReader/e6d9c08d6a187cc38bf5908a29cd8a49e22232b3/src/PDFium.PrintDlg.pas -------------------------------------------------------------------------------- /src/PDFium.SearchDlg.dfm: -------------------------------------------------------------------------------- 1 | object SearchDlg: TSearchDlg 2 | Left = 0 3 | Top = 0 4 | BorderIcons = [biSystemMenu] 5 | BorderStyle = bsSingle 6 | Caption = 'Search' 7 | ClientHeight = 70 8 | ClientWidth = 210 9 | Color = clBtnFace 10 | CustomTitleBar.CaptionAlignment = taCenter 11 | Font.Charset = DEFAULT_CHARSET 12 | Font.Color = clWindowText 13 | Font.Height = -11 14 | Font.Name = 'Tahoma' 15 | Font.Style = [] 16 | FormStyle = fsStayOnTop 17 | KeyPreview = True 18 | OldCreateOrder = False 19 | Position = poOwnerFormCenter 20 | Visible = True 21 | OnDestroy = FormDestroy 22 | OnKeyDown = FormKeyDown 23 | PixelsPerInch = 96 24 | TextHeight = 13 25 | object edSearch: TEdit 26 | Left = 8 27 | Top = 8 28 | Width = 193 29 | Height = 21 30 | TabOrder = 0 31 | end 32 | object btPrev: TButton 33 | Left = 8 34 | Top = 35 35 | Width = 75 36 | Height = 25 37 | Caption = 'Prev' 38 | TabOrder = 1 39 | OnClick = btNextClick 40 | end 41 | object btNext: TButton 42 | Left = 126 43 | Top = 35 44 | Width = 75 45 | Height = 25 46 | Caption = 'Next' 47 | TabOrder = 2 48 | OnClick = btNextClick 49 | end 50 | end 51 | -------------------------------------------------------------------------------- /src/PDFium.SearchDlg.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tothpaul/PDFiumReader/e6d9c08d6a187cc38bf5908a29cd8a49e22232b3/src/PDFium.SearchDlg.pas -------------------------------------------------------------------------------- /src/PDFiumReader.dpr: -------------------------------------------------------------------------------- 1 | program PDFiumReader; 2 | 3 | uses 4 | Vcl.Forms, 5 | Main in 'Main.pas' {MainForm}, 6 | PDFium.Frame in 'PDFium.Frame.pas' {PDFiumFrame: TFrame}, 7 | DynamicButtons in 'DynamicButtons.pas', 8 | Execute.libPDFium in 'Execute.libPDFium.pas', 9 | PDFium.PrintDlg in 'PDFium.PrintDlg.pas' {PrintDlg}, 10 | PDFium.SearchDlg in 'PDFium.SearchDlg.pas' {SearchDlg}; 11 | 12 | {$R *.res} 13 | 14 | begin 15 | ReportMemoryLeaksOnShutdown := True; 16 | Application.Initialize; 17 | Application.MainFormOnTaskbar := True; 18 | Application.CreateForm(TMainForm, MainForm); 19 | Application.Run; 20 | end. 21 | -------------------------------------------------------------------------------- /src/PDFiumReader.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {75AEF3A2-72AF-40A0-B989-86DE9C1F6CA6} 4 | 18.8 5 | VCL 6 | PDFiumReader.dpr 7 | True 8 | Debug 9 | Win32 10 | 3 11 | Application 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Cfg_1 34 | true 35 | true 36 | 37 | 38 | true 39 | Cfg_1 40 | true 41 | true 42 | 43 | 44 | true 45 | Base 46 | true 47 | 48 | 49 | true 50 | Cfg_2 51 | true 52 | true 53 | 54 | 55 | true 56 | Cfg_2 57 | true 58 | true 59 | 60 | 61 | .\$(Platform)\$(Config) 62 | .\$(Platform)\$(Config) 63 | false 64 | false 65 | false 66 | false 67 | false 68 | RESTComponents;emsclientfiredac;DataSnapFireDAC;FireDACIBDriver;emsclient;FireDACCommon;RESTBackendComponents;soapserver;CloudService;FireDACCommonDriver;inet;FireDAC;FireDACSqliteDriver;soaprtl;soapmidas;$(DCC_UsePackage) 69 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 70 | $(BDS)\bin\delphi_PROJECTICON.ico 71 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 72 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 73 | PDFiumReader 74 | 75 | 76 | DBXSqliteDriver;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;svnui;tethering;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;emsedge;CrossAPIRegister;fmx;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;DataSnapConnectors;VCLRESTComponents;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;DataSnapClient;bindcompdbx;IndyIPCommon;vcl;DBXSybaseASEDriver;IndyIPServer;IndySystem;FireDACDb2Driver;dsnapcon;madExcept_;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;madBasic_;emshosting;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;DbxCommonDriver;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;madDisAsm_;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;CrossAPI;dbxcds;VclSmp;FOODPackage;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;FOODPackageRegister;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;fmxase;$(DCC_UsePackage) 77 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 78 | Debug 79 | true 80 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 81 | 1033 82 | $(BDS)\bin\default_app.manifest 83 | 84 | 85 | DBXSqliteDriver;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;tethering;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;emsedge;fmx;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;DataSnapConnectors;VCLRESTComponents;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;DataSnapClient;bindcompdbx;IndyIPCommon;vcl;DBXSybaseASEDriver;IndyIPServer;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;emshosting;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;DbxCommonDriver;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;fmxase;$(DCC_UsePackage) 86 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 87 | Debug 88 | true 89 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 90 | 1033 91 | $(BDS)\bin\default_app.manifest 92 | 93 | 94 | DEBUG;$(DCC_Define) 95 | true 96 | false 97 | true 98 | true 99 | true 100 | 101 | 102 | false 103 | true 104 | true 105 | 1033 106 | CompanyName=Execute SARL;FileDescription=libPDFium Reader;FileVersion=1.0.0.0;InternalName=PDFiumReader;LegalCopyright=Execute SARL;LegalTrademarks=;OriginalFilename=PDFiumReader.exe;ProgramID=fr.execute.pdfiumreader;ProductName=PDFiumReader;ProductVersion=1.0.0.0;Comments= 107 | ..\bin 108 | PerMonitor 109 | 3 110 | 111 | 112 | true 113 | PerMonitorV2 114 | madExcept;$(DCC_Define) 115 | 3 116 | 117 | 118 | false 119 | RELEASE;$(DCC_Define) 120 | 0 121 | 0 122 | 123 | 124 | true 125 | ..\bin 126 | true 127 | 1033 128 | PerMonitor 129 | 130 | 131 | true 132 | PerMonitorV2 133 | 3 134 | 2 135 | true 136 | 137 | 138 | 139 | MainSource 140 | 141 | 142 |
MainForm
143 | dfm 144 |
145 | 146 |
PDFiumFrame
147 | dfm 148 | TFrame 149 |
150 | 151 | 152 | 153 |
PrintDlg
154 | dfm 155 |
156 | 157 | Cfg_2 158 | Base 159 | 160 | 161 | Base 162 | 163 | 164 | Cfg_1 165 | Base 166 | 167 |
168 | 169 | Delphi.Personality.12 170 | Application 171 | 172 | 173 | 174 | PDFiumReader.dpr 175 | 176 | 177 | Composants Microsoft Office 2000 Sample Automation Server Wrapper 178 | Composants Microsoft Office XP Sample Automation Server Wrapper 179 | 180 | 181 | 182 | 183 | 184 | PDFiumReader.exe 185 | true 186 | 187 | 188 | 189 | 190 | 1 191 | 192 | 193 | Contents\MacOS 194 | 1 195 | 196 | 197 | 0 198 | 199 | 200 | 201 | 202 | classes 203 | 1 204 | 205 | 206 | classes 207 | 1 208 | 209 | 210 | 211 | 212 | res\xml 213 | 1 214 | 215 | 216 | res\xml 217 | 1 218 | 219 | 220 | 221 | 222 | library\lib\armeabi-v7a 223 | 1 224 | 225 | 226 | 227 | 228 | library\lib\armeabi 229 | 1 230 | 231 | 232 | library\lib\armeabi 233 | 1 234 | 235 | 236 | 237 | 238 | library\lib\armeabi-v7a 239 | 1 240 | 241 | 242 | 243 | 244 | library\lib\mips 245 | 1 246 | 247 | 248 | library\lib\mips 249 | 1 250 | 251 | 252 | 253 | 254 | library\lib\armeabi-v7a 255 | 1 256 | 257 | 258 | library\lib\arm64-v8a 259 | 1 260 | 261 | 262 | 263 | 264 | library\lib\armeabi-v7a 265 | 1 266 | 267 | 268 | 269 | 270 | res\drawable 271 | 1 272 | 273 | 274 | res\drawable 275 | 1 276 | 277 | 278 | 279 | 280 | res\values 281 | 1 282 | 283 | 284 | res\values 285 | 1 286 | 287 | 288 | 289 | 290 | res\values-v21 291 | 1 292 | 293 | 294 | res\values-v21 295 | 1 296 | 297 | 298 | 299 | 300 | res\values 301 | 1 302 | 303 | 304 | res\values 305 | 1 306 | 307 | 308 | 309 | 310 | res\drawable 311 | 1 312 | 313 | 314 | res\drawable 315 | 1 316 | 317 | 318 | 319 | 320 | res\drawable-xxhdpi 321 | 1 322 | 323 | 324 | res\drawable-xxhdpi 325 | 1 326 | 327 | 328 | 329 | 330 | res\drawable-ldpi 331 | 1 332 | 333 | 334 | res\drawable-ldpi 335 | 1 336 | 337 | 338 | 339 | 340 | res\drawable-mdpi 341 | 1 342 | 343 | 344 | res\drawable-mdpi 345 | 1 346 | 347 | 348 | 349 | 350 | res\drawable-hdpi 351 | 1 352 | 353 | 354 | res\drawable-hdpi 355 | 1 356 | 357 | 358 | 359 | 360 | res\drawable-xhdpi 361 | 1 362 | 363 | 364 | res\drawable-xhdpi 365 | 1 366 | 367 | 368 | 369 | 370 | res\drawable-mdpi 371 | 1 372 | 373 | 374 | res\drawable-mdpi 375 | 1 376 | 377 | 378 | 379 | 380 | res\drawable-hdpi 381 | 1 382 | 383 | 384 | res\drawable-hdpi 385 | 1 386 | 387 | 388 | 389 | 390 | res\drawable-xhdpi 391 | 1 392 | 393 | 394 | res\drawable-xhdpi 395 | 1 396 | 397 | 398 | 399 | 400 | res\drawable-xxhdpi 401 | 1 402 | 403 | 404 | res\drawable-xxhdpi 405 | 1 406 | 407 | 408 | 409 | 410 | res\drawable-xxxhdpi 411 | 1 412 | 413 | 414 | res\drawable-xxxhdpi 415 | 1 416 | 417 | 418 | 419 | 420 | res\drawable-small 421 | 1 422 | 423 | 424 | res\drawable-small 425 | 1 426 | 427 | 428 | 429 | 430 | res\drawable-normal 431 | 1 432 | 433 | 434 | res\drawable-normal 435 | 1 436 | 437 | 438 | 439 | 440 | res\drawable-large 441 | 1 442 | 443 | 444 | res\drawable-large 445 | 1 446 | 447 | 448 | 449 | 450 | res\drawable-xlarge 451 | 1 452 | 453 | 454 | res\drawable-xlarge 455 | 1 456 | 457 | 458 | 459 | 460 | res\values 461 | 1 462 | 463 | 464 | res\values 465 | 1 466 | 467 | 468 | 469 | 470 | 1 471 | 472 | 473 | Contents\MacOS 474 | 1 475 | 476 | 477 | 0 478 | 479 | 480 | 481 | 482 | Contents\MacOS 483 | 1 484 | .framework 485 | 486 | 487 | Contents\MacOS 488 | 1 489 | .framework 490 | 491 | 492 | 0 493 | 494 | 495 | 496 | 497 | 1 498 | .dylib 499 | 500 | 501 | 1 502 | .dylib 503 | 504 | 505 | 1 506 | .dylib 507 | 508 | 509 | Contents\MacOS 510 | 1 511 | .dylib 512 | 513 | 514 | Contents\MacOS 515 | 1 516 | .dylib 517 | 518 | 519 | 0 520 | .dll;.bpl 521 | 522 | 523 | 524 | 525 | 1 526 | .dylib 527 | 528 | 529 | 1 530 | .dylib 531 | 532 | 533 | 1 534 | .dylib 535 | 536 | 537 | Contents\MacOS 538 | 1 539 | .dylib 540 | 541 | 542 | Contents\MacOS 543 | 1 544 | .dylib 545 | 546 | 547 | 0 548 | .bpl 549 | 550 | 551 | 552 | 553 | 0 554 | 555 | 556 | 0 557 | 558 | 559 | 0 560 | 561 | 562 | 0 563 | 564 | 565 | 0 566 | 567 | 568 | Contents\Resources\StartUp\ 569 | 0 570 | 571 | 572 | Contents\Resources\StartUp\ 573 | 0 574 | 575 | 576 | 0 577 | 578 | 579 | 580 | 581 | 1 582 | 583 | 584 | 1 585 | 586 | 587 | 1 588 | 589 | 590 | 591 | 592 | 1 593 | 594 | 595 | 1 596 | 597 | 598 | 1 599 | 600 | 601 | 602 | 603 | 1 604 | 605 | 606 | 1 607 | 608 | 609 | 1 610 | 611 | 612 | 613 | 614 | 1 615 | 616 | 617 | 1 618 | 619 | 620 | 1 621 | 622 | 623 | 624 | 625 | 1 626 | 627 | 628 | 1 629 | 630 | 631 | 1 632 | 633 | 634 | 635 | 636 | 1 637 | 638 | 639 | 1 640 | 641 | 642 | 1 643 | 644 | 645 | 646 | 647 | 1 648 | 649 | 650 | 1 651 | 652 | 653 | 1 654 | 655 | 656 | 657 | 658 | 1 659 | 660 | 661 | 1 662 | 663 | 664 | 1 665 | 666 | 667 | 668 | 669 | 1 670 | 671 | 672 | 1 673 | 674 | 675 | 1 676 | 677 | 678 | 679 | 680 | 1 681 | 682 | 683 | 1 684 | 685 | 686 | 1 687 | 688 | 689 | 690 | 691 | 1 692 | 693 | 694 | 1 695 | 696 | 697 | 1 698 | 699 | 700 | 701 | 702 | 1 703 | 704 | 705 | 1 706 | 707 | 708 | 1 709 | 710 | 711 | 712 | 713 | 1 714 | 715 | 716 | 1 717 | 718 | 719 | 1 720 | 721 | 722 | 723 | 724 | 1 725 | 726 | 727 | 1 728 | 729 | 730 | 1 731 | 732 | 733 | 734 | 735 | 1 736 | 737 | 738 | 1 739 | 740 | 741 | 1 742 | 743 | 744 | 745 | 746 | 1 747 | 748 | 749 | 1 750 | 751 | 752 | 1 753 | 754 | 755 | 756 | 757 | 1 758 | 759 | 760 | 1 761 | 762 | 763 | 1 764 | 765 | 766 | 767 | 768 | 1 769 | 770 | 771 | 1 772 | 773 | 774 | 1 775 | 776 | 777 | 778 | 779 | 1 780 | 781 | 782 | 1 783 | 784 | 785 | 1 786 | 787 | 788 | 789 | 790 | 1 791 | 792 | 793 | 1 794 | 795 | 796 | 1 797 | 798 | 799 | 800 | 801 | 1 802 | 803 | 804 | 1 805 | 806 | 807 | 1 808 | 809 | 810 | 811 | 812 | 1 813 | 814 | 815 | 1 816 | 817 | 818 | 1 819 | 820 | 821 | 822 | 823 | 1 824 | 825 | 826 | 1 827 | 828 | 829 | 1 830 | 831 | 832 | 833 | 834 | 1 835 | 836 | 837 | 1 838 | 839 | 840 | 1 841 | 842 | 843 | 844 | 845 | 1 846 | 847 | 848 | 1 849 | 850 | 851 | 1 852 | 853 | 854 | 855 | 856 | 1 857 | 858 | 859 | 1 860 | 861 | 862 | 1 863 | 864 | 865 | 866 | 867 | 1 868 | 869 | 870 | 1 871 | 872 | 873 | 1 874 | 875 | 876 | 877 | 878 | 1 879 | 880 | 881 | 1 882 | 883 | 884 | 1 885 | 886 | 887 | 888 | 889 | 1 890 | 891 | 892 | 1 893 | 894 | 895 | 896 | 897 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 898 | 1 899 | 900 | 901 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 902 | 1 903 | 904 | 905 | 906 | 907 | 1 908 | 909 | 910 | 1 911 | 912 | 913 | 914 | 915 | ..\ 916 | 1 917 | 918 | 919 | ..\ 920 | 1 921 | 922 | 923 | 924 | 925 | 1 926 | 927 | 928 | 1 929 | 930 | 931 | 1 932 | 933 | 934 | 935 | 936 | 1 937 | 938 | 939 | 1 940 | 941 | 942 | 1 943 | 944 | 945 | 946 | 947 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 948 | 1 949 | 950 | 951 | 952 | 953 | ..\ 954 | 1 955 | 956 | 957 | ..\ 958 | 1 959 | 960 | 961 | 962 | 963 | Contents 964 | 1 965 | 966 | 967 | Contents 968 | 1 969 | 970 | 971 | 972 | 973 | Contents\Resources 974 | 1 975 | 976 | 977 | Contents\Resources 978 | 1 979 | 980 | 981 | 982 | 983 | library\lib\armeabi-v7a 984 | 1 985 | 986 | 987 | library\lib\arm64-v8a 988 | 1 989 | 990 | 991 | 1 992 | 993 | 994 | 1 995 | 996 | 997 | 1 998 | 999 | 1000 | 1 1001 | 1002 | 1003 | Contents\MacOS 1004 | 1 1005 | 1006 | 1007 | Contents\MacOS 1008 | 1 1009 | 1010 | 1011 | 0 1012 | 1013 | 1014 | 1015 | 1016 | library\lib\armeabi-v7a 1017 | 1 1018 | 1019 | 1020 | 1021 | 1022 | 1 1023 | 1024 | 1025 | 1 1026 | 1027 | 1028 | 1029 | 1030 | Assets 1031 | 1 1032 | 1033 | 1034 | Assets 1035 | 1 1036 | 1037 | 1038 | 1039 | 1040 | Assets 1041 | 1 1042 | 1043 | 1044 | Assets 1045 | 1 1046 | 1047 | 1048 | 1049 | 1050 | 1051 | 1052 | 1053 | 1054 | 1055 | 1056 | 1057 | 1058 | 1059 | 1060 | True 1061 | True 1062 | 1063 | 1064 | 12 1065 | 1066 | 1067 | 1068 | 1069 |
1070 | -------------------------------------------------------------------------------- /src/PDFiumReader.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tothpaul/PDFiumReader/e6d9c08d6a187cc38bf5908a29cd8a49e22232b3/src/PDFiumReader.res --------------------------------------------------------------------------------