Page 7 of 10
Re: [Module] pbPDF-Module
Posted: Sat May 29, 2021 6:54 pm
by StarBootics
Kwai chang caine wrote: Sat May 29, 2021 6:31 pm
Hello at all
Excuse by advance this stupid question

, but is it possible to simply open and show an existing PDF ? with this splendid module
I'm pretty sure that this module does not contain a PDF document renderer. It can be used to create a PDF document that can be opened with a PDF document reader.
Best regards
StarBootics
Re: [Module] pbPDF-Module
Posted: Mon May 31, 2021 7:25 pm
by Kwai chang caine
Thanks for your answer StarBootics, this is what i thought too, but i still wanted to be sure
I'm looking for a code that can open an existing PDF and modify it
In any case, Thorsten1867 really did a big job, like always

Re: [Module] pbPDF-Module
Posted: Mon May 31, 2021 7:45 pm
by StarBootics
Kwai chang caine wrote: Mon May 31, 2021 7:25 pm
I'm looking for a code that can open an existing PDF and modify it
I think you will have to create it your self.
Best regards
StarBootics
Re: [Module] pbPDF-Module
Posted: Thu Aug 05, 2021 7:20 am
by DeanH
I have been using pbPDF without any problems up through PureBasic 5.73 Win, both 32 and 64-bit versions. However, I it crashes when I try to use it in the trial Alpha3 version of PB6.00. PbPDF compiles ok, and the program runs, but generates an Invalid Memory Access error for the line
Version = ipdf_EndianL(*TTF_Memory\sfnt_version) when it reaches the line.
Norm suggested I try a workaround by DoubleDutch for the endian functions but the compiler does not seem to recognize the constant #PB_Processor_C. Won't compile. I have tried using both the asm and c-backend compilers with the same results.
The line is CompilerIf #PB_Compiler_Processor=#PB_Processor_C
Any ideas?
Re: [Module] pbPDF-Module
Posted: Thu Aug 05, 2021 7:26 am
by DeanH
Sorry, I found Fred's statement on the constant. It is now : #PB_Compiler_Backend, #PB_Backend_Asm and #PB_Backend_C. Testing for that works, but the endian functions still crash when compiled with the asm instead of C backend.
Re: [Module] pbPDF-Module
Posted: Thu Aug 05, 2021 9:07 am
by HeX0R
I can't find that ipdf_EndianL() anywhere in the pbPDFModule.pbi, where is that coming from?
Re: [Module] pbPDF-Module
Posted: Thu Aug 05, 2021 9:36 am
by Lord
@DeanH & @HeX0R:
I'm using PurePDF2.0 distributed ba Normeus:
http://normeus.com/purepdf/
I had to include a change suggested by DoubleDutch:
viewtopic.php?f=4&t=77331&p=570608
At least the ASM back end worked with pdf:
Code: Select all
CompilerIf #PB_Backend_C; in Alpha 3
Procedure.l ipdf_EndianL(value.l)
ProcedureReturn (value>>24&$ff)|(value>>8&$ff00)|(value<<24&$ff000000)|(value<<8&$ff0000)
EndProcedure
Procedure.q ipdf_EndianQ(value.q)
ProcedureReturn (value>>56&$ff)|(value>>40&$ff00)|(value>>24&$ff0000)|(value>>8&$ff000000)|(value<<56&$ff00000000000000)|(value<<40&$ff000000000000)|(value<<24&$ff0000000000)|(value<<8&$ff00000000)
EndProcedure
Procedure.w ipdf_EndianW(value.w)
ProcedureReturn (value>>8&$ff)|(value<<8&$ff00)
EndProcedure
CompilerElse
;Thanks to Rescator / skywalk / wilbert for the Procedures EndianW() / EndianL() / EndianQ()
Procedure.l ipdf_EndianL(value.l)
; Rescator : http://forums.purebasic.com/english/viewtopic.php?p=84270&sid=7f3f06eae02ad44b303655fb722bb0f0#p84270
EnableASM
MOV Eax,value
BSWAP Eax
DisableASM
ProcedureReturn
EndProcedure
CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
Procedure.q ipdf_EndianQ(value.q)
; Rescator : http://www.purebasic.fr/english/viewtopic.php?p=84270#p84270
EnableASM
MOV rax, value
BSWAP rax
DisableASM
ProcedureReturn
EndProcedure
CompilerElse
Procedure.q ipdf_EndianQ(value.q)
; Wilbert : http://www.purebasic.fr/english/viewtopic.php?p=361932#p361932
Protected addr.l=@value
EnableASM
MOV edx, addr
MOV eax, [edx + 4]
MOV edx, [edx]
BSWAP eax
BSWAP edx
DisableASM
ProcedureReturn
EndProcedure
CompilerEndIf
Procedure.w ipdf_EndianW(value.w)
; skywalk/wilbert : http://forums.purebasic.com/english/viewtopic.php?p=352259&sid=7f3f06eae02ad44b303655fb722bb0f0#p352259
EnableASM
ROL value, 8
DisableASM
ProcedureReturn value
EndProcedure
CompilerEndIf
I do not use C backend anymore because there are a lot of troubles and I'm waiting for a new version of PB.
Re: [Module] pbPDF-Module
Posted: Thu Aug 05, 2021 4:04 pm
by normeus
Lord,
Thank you for the changes, I will add them to the file I am hosting.
Everyone,
pbPDF-Module ( link at the beginning of this thread ) is better. it has been updated by Thorsten1867.
I searched pbPDF-Module for any sign of ASM and I couldn't find anything. tried some Examples and they worked using "PB 6 version 2 C backend" . No need to check for "CompilerIf #PB_Backend_C".
I don't use the module so I am not able to test it in a real life situation. If you have a small code sample I could test it.
[edit]
I downloaded version 3 and it also worked fine.
your test for #PB_backend_C should look more like this for it to work on pb 5.72 without getting an error about constant not found (only change the compilerif) :
Code: Select all
CompilerIf Defined(PB_Backend_C,#PB_Constant); in Alpha 3 <--- if constant not defined you are running ASM from older PB
Debug " Alpha 3"
CompilerElse
Debug "Good old ASM here"
CompilerEndIf
If you were getting a constant not found error then you were not running version 3
Norm.
Re: [Module] pbPDF-Module
Posted: Sun Aug 08, 2021 4:00 am
by DeanH
I finally got pbPDF to work in PB6. The problem I had was my fault. I was using PurePDF but did not realize it. The endian functions are not in pbPDF but they are in the older one. I thought I had changed before but discovered I hadn't.

My apologies for the panic. pbPDF seems to compile Ok in both the asm and c backend modes.
Re: [Module] pbPDF-Module
Posted: Wed Sep 15, 2021 12:35 am
by DeanH
I have a problem involving fonts other than Helvetica, Courier or Times.
From what I've read, to use a font other than Arial or Times in pbPDF, the font needs to be embedded with the function EmbedFont before SetFont can be used. This function requires the font's filename as well as font family name. An example font would be Comic Sans MS.
Is there a way to use/set a font by its name without having to know the filename?
I have had a look at the source code and it is beyond me.
Re: [Module] pbPDF-Module
Posted: Wed Sep 15, 2021 2:46 am
by normeus
DeanH,
You have to know the font filename to be able to load it into the pdf. You don't need the font family name or better put, font family name is currently not working.
it's easy to find the filename on windows:
Start->Settings->fonts then click on the font you want and it will give you the filename. Currently "Font Family Name" is the name pbPDF will use to access the font you loaded, so if you call the font "FUNNY" instead of "Comic" it will find and use "FUNNY".
Only Underline works with loaded fonts. Not Bold or Italic.
Code: Select all
XIncludeFile "..\pbPDFModule.pbi"
Define File$="pbPDF-EmbedFont-1.pdf"
;
;On windows, From start button click on settings cog then click on fonts. to the right click on the font you want
; it will give you the "Font file name"
;
; currently EmbedFont works this way {filename of font}{name to identify font}{style (not working)}{UNICODE FLAG}
;
#PDF = 1
If PDF::Create(#PDF)
PDF::AddPage(#PDF)
PDF::EmbedFont(#PDF,"c:\windows\fonts\BAHNSCHRIFT.TTF", "bahc"); There is something wrong with loading other font faces like "condensed" or "Bold"
PDF::EmbedFont(#PDF,"c:\windows\fonts\BROADW.TTF", "bro","U") ; "U" is the style here, but it seems to ignore it
PDF::EmbedFont(#PDF, "l_10646.ttf", "Luci", "", PDF::#Unicode); unicode example
PDF::SetFont(#PDF, "bahc", "", 16)
PDF::PlaceText(#PDF, "This is an embedded TrueType-font (BAHNSCHRIFT)", 10, 20)
PDF::SetFont(#PDF, "bro", "", 16)
PDF::PlaceText(#PDF, "This is an embedded TrueType-font (BROADWAY)", 10, 35)
PDF::SetFont(#PDF, "Luci", "", 14)
PDF::PlaceText(#PDF, "This is an embedded Unicode-font (LucidaSans)", 10, 50)
PDF::SetFont(#PDF, "Luci", "U", 11)
PDF::PlaceText(#PDF, "This is an embedded Unicode-font (LucidaSans Underlined)", 10, 60)
PDF::Close(#PDF, File$)
EndIf
RunProgram(File$)
Norm.
Re: [Module] pbPDF-Module
Posted: Wed Sep 15, 2021 3:52 am
by DeanH
Thank you for the response. My users can choose a font using a font requester. The older PurePDF can set a font only using the name (I know LoadFont is involved) so I had hoped pbPDF could as well.
Re: [Module] pbPDF-Module
Posted: Thu Sep 16, 2021 1:29 am
by DeanH
I have tried to embed Comic Sans MS. Filename is c:\windows\fonts\comic.ttf. It shows courier instead. Am I missing something?
Code: Select all
XIncludeFile "..\pbPDFModule.pbi"
Define File$="pbPDF-EmbedFont-1.pdf"
#PDF = 1
If PDF::Create(#PDF)
PDF::AddPage(#PDF)
PDF::EmbedFont(#PDF,"c:\windows\fonts\BAHNSCHRIFT.TTF", "bahc")
PDF::EmbedFont(#PDF,"c:\windows\fonts\comic.ttf", "Comic")
PDF::SetFont(#PDF, "bahc", "", 16)
PDF::PlaceText(#PDF, "This is an embedded TrueType-font (BAHNSCHRIFT)", 10, 20)
PDF::SetFont(#PDF, "Comic", "", 16)
PDF::PlaceText(#PDF, "This is an embedded TrueType-font (Comic Sans MS)", 10, 35)
PDF::Close(#PDF, File$)
EndIf
RunProgram(File$)
Re: [Module] pbPDF-Module
Posted: Thu Sep 16, 2021 12:05 pm
by BarryG
DeanH wrote: Thu Sep 16, 2021 1:29 amI have tried to embed Comic Sans MS. Filename is c:\windows\fonts\comic.ttf. It shows courier instead. Am I missing something?
Your code snippet works here with the Comic Sans MS font (see below). Maybe your PDF viewer is the problem?

Re: [Module] pbPDF-Module
Posted: Thu Sep 16, 2021 11:11 pm
by normeus
I tried Adobe reader and it displayed the font. I know you typed the path but, check PDF errors specially when you are using user provided input:
Code: Select all
PDF::EmbedFont(#PDF, "c:\windows\fonts\comic.TTF", "Comic")
Debug PDF::GetErrorMessage(#pdf) ; instead of debug you should notify the user that the font is not available
; if a font file is not found, it will default to courier
I tried a font called "Elephant" all my PDF readers worked except for Adobe which gave me an error. You might not want to allow your users to use any font.
Norm.